From c0b7206652b2852bc574694e7ba07ba1c2acdc00 Mon Sep 17 00:00:00 2001 From: hongbotian Date: Mon, 30 Nov 2015 03:10:21 -0500 Subject: delete app Change-Id: Id4c572809969ebe89e946e88063eaed262cff3f2 Signed-off-by: hongbotian --- .../native/common/.indent.pro | 18 - .../native/common/.libs/jk_ajp12_worker.o | Bin 72992 -> 0 bytes .../native/common/.libs/jk_ajp13.o | Bin 11264 -> 0 bytes .../native/common/.libs/jk_ajp13_worker.o | Bin 35280 -> 0 bytes .../native/common/.libs/jk_ajp14.o | Bin 74416 -> 0 bytes .../native/common/.libs/jk_ajp14_worker.o | Bin 70736 -> 0 bytes .../native/common/.libs/jk_ajp_common.o | Bin 291472 -> 0 bytes .../native/common/.libs/jk_connect.o | Bin 84960 -> 0 bytes .../native/common/.libs/jk_context.o | Bin 19080 -> 0 bytes .../native/common/.libs/jk_jni_worker.o | Bin 16128 -> 0 bytes .../native/common/.libs/jk_lb_worker.o | Bin 172368 -> 0 bytes .../native/common/.libs/jk_map.o | Bin 83792 -> 0 bytes .../native/common/.libs/jk_md5.o | Bin 20208 -> 0 bytes .../native/common/.libs/jk_msg_buff.o | Bin 23520 -> 0 bytes .../native/common/.libs/jk_pool.o | Bin 13048 -> 0 bytes .../native/common/.libs/jk_shm.o | Bin 60272 -> 0 bytes .../native/common/.libs/jk_sockbuf.o | Bin 13680 -> 0 bytes .../native/common/.libs/jk_status.o | Bin 828736 -> 0 bytes .../native/common/.libs/jk_uri_worker_map.o | Bin 126944 -> 0 bytes .../native/common/.libs/jk_url.o | Bin 9312 -> 0 bytes .../native/common/.libs/jk_util.o | Bin 244016 -> 0 bytes .../native/common/.libs/jk_worker.o | Bin 55776 -> 0 bytes .../native/common/Makefile | 49 - .../native/common/Makefile.in | 49 - .../native/common/ap_snprintf.c | 1178 ----- .../native/common/ap_snprintf.h | 150 - .../native/common/config.h | 110 - .../native/common/config.h.in | 109 - .../native/common/jk.rc | 74 - .../native/common/jk_ajp12_worker.c | 682 --- .../native/common/jk_ajp12_worker.h | 45 - .../native/common/jk_ajp12_worker.lo | 12 - .../native/common/jk_ajp12_worker.o | Bin 71160 -> 0 bytes .../native/common/jk_ajp13.c | 50 - .../native/common/jk_ajp13.h | 126 - .../native/common/jk_ajp13.lo | 12 - .../native/common/jk_ajp13.o | Bin 11104 -> 0 bytes .../native/common/jk_ajp13_worker.c | 94 - .../native/common/jk_ajp13_worker.h | 50 - .../native/common/jk_ajp13_worker.lo | 12 - .../native/common/jk_ajp13_worker.o | Bin 35184 -> 0 bytes .../native/common/jk_ajp14.c | 695 --- .../native/common/jk_ajp14.h | 307 -- .../native/common/jk_ajp14.lo | 12 - .../native/common/jk_ajp14.o | Bin 73016 -> 0 bytes .../native/common/jk_ajp14_worker.c | 404 -- .../native/common/jk_ajp14_worker.h | 52 - .../native/common/jk_ajp14_worker.lo | 12 - .../native/common/jk_ajp14_worker.o | Bin 69632 -> 0 bytes .../native/common/jk_ajp_common.c | 3383 ------------- .../native/common/jk_ajp_common.h | 467 -- .../native/common/jk_ajp_common.lo | 12 - .../native/common/jk_ajp_common.o | Bin 283648 -> 0 bytes .../native/common/jk_connect.c | 1190 ----- .../native/common/jk_connect.h | 78 - .../native/common/jk_connect.lo | 12 - .../native/common/jk_connect.o | Bin 83736 -> 0 bytes .../native/common/jk_context.c | 296 -- .../native/common/jk_context.h | 138 - .../native/common/jk_context.lo | 12 - .../native/common/jk_context.o | Bin 19176 -> 0 bytes .../native/common/jk_global.h | 405 -- .../native/common/jk_jni_worker.c | 1267 ----- .../native/common/jk_jni_worker.h | 45 - .../native/common/jk_jni_worker.lo | 12 - .../native/common/jk_jni_worker.o | Bin 15984 -> 0 bytes .../native/common/jk_lb_worker.c | 1823 ------- .../native/common/jk_lb_worker.h | 222 - .../native/common/jk_lb_worker.lo | 12 - .../native/common/jk_lb_worker.o | Bin 170152 -> 0 bytes .../native/common/jk_logger.h | 139 - .../native/common/jk_map.c | 889 ---- .../native/common/jk_map.h | 95 - .../native/common/jk_map.lo | 12 - .../native/common/jk_map.o | Bin 90080 -> 0 bytes .../native/common/jk_md5.c | 475 -- .../native/common/jk_md5.h | 84 - .../native/common/jk_md5.lo | 12 - .../native/common/jk_md5.o | Bin 20768 -> 0 bytes .../native/common/jk_msg_buff.c | 382 -- .../native/common/jk_msg_buff.h | 154 - .../native/common/jk_msg_buff.lo | 12 - .../native/common/jk_msg_buff.o | Bin 24304 -> 0 bytes .../native/common/jk_mt.h | 150 - .../native/common/jk_nwmain.c | 103 - .../native/common/jk_pool.c | 165 - .../native/common/jk_pool.h | 126 - .../native/common/jk_pool.lo | 12 - .../native/common/jk_pool.o | Bin 12968 -> 0 bytes .../native/common/jk_service.h | 546 -- .../native/common/jk_shm.c | 812 --- .../native/common/jk_shm.h | 258 - .../native/common/jk_shm.lo | 12 - .../native/common/jk_shm.o | Bin 59384 -> 0 bytes .../native/common/jk_sockbuf.c | 195 - .../native/common/jk_sockbuf.h | 45 - .../native/common/jk_sockbuf.lo | 12 - .../native/common/jk_sockbuf.o | Bin 13624 -> 0 bytes .../native/common/jk_status.c | 5200 -------------------- .../native/common/jk_status.h | 44 - .../native/common/jk_status.lo | 12 - .../native/common/jk_status.o | Bin 806096 -> 0 bytes .../native/common/jk_types.h | 69 - .../native/common/jk_types.h.in | 69 - .../native/common/jk_uri_worker_map.c | 1191 ----- .../native/common/jk_uri_worker_map.h | 208 - .../native/common/jk_uri_worker_map.lo | 12 - .../native/common/jk_uri_worker_map.o | Bin 124368 -> 0 bytes .../native/common/jk_url.c | 124 - .../native/common/jk_url.h | 44 - .../native/common/jk_url.lo | 12 - .../native/common/jk_url.o | Bin 9200 -> 0 bytes .../native/common/jk_util.c | 2253 --------- .../native/common/jk_util.h | 269 - .../native/common/jk_util.lo | 12 - .../native/common/jk_util.o | Bin 243024 -> 0 bytes .../native/common/jk_version.h | 96 - .../native/common/jk_worker.c | 351 -- .../native/common/jk_worker.h | 55 - .../native/common/jk_worker.lo | 12 - .../native/common/jk_worker.o | Bin 54176 -> 0 bytes .../native/common/jk_worker_list.h | 98 - .../native/common/list.mk | 27 - .../native/common/list.mk.in | 27 - .../native/common/stamp-h1 | 1 - 125 files changed, 28552 deletions(-) delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/.indent.pro delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp12_worker.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp13.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp13_worker.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp14.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp14_worker.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp_common.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_connect.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_context.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_jni_worker.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_lb_worker.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_map.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_md5.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_msg_buff.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_pool.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_shm.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_sockbuf.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_status.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_uri_worker_map.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_url.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_util.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_worker.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/Makefile delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/Makefile.in delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/ap_snprintf.c delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/ap_snprintf.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/config.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/config.h.in delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk.rc delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.c delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.lo delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.c delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.lo delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.c delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.lo delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.c delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.lo delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.c delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.lo delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.c delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.lo delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.c delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.lo delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.c delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.lo delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_global.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.c delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.lo delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.c delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.lo delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_logger.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.c delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.lo delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.c delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.lo delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.c delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.lo delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_mt.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_nwmain.c delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.c delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.lo delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_service.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.c delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.lo delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.c delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.lo delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.c delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.lo delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_types.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_types.h.in delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.c delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.lo delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_url.c delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_url.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_url.lo delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_url.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.c delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.lo delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_version.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.c delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.lo delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.o delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker_list.h delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/list.mk delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/list.mk.in delete mode 100644 rubbos/app/tomcat-connectors-1.2.32-src/native/common/stamp-h1 (limited to 'rubbos/app/tomcat-connectors-1.2.32-src/native/common') diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.indent.pro b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.indent.pro deleted file mode 100644 index 87ca4192..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.indent.pro +++ /dev/null @@ -1,18 +0,0 @@ --i4 -npsl -di0 -br -nce -d0 -cli0 -npcs -nfc1 -nut -ncs --Tjk_env_t --Tjk_worker_t --Tjk_worker_env_t --Tjk_endpoint_t --Tjk_channel_t --Tjk_sockbuf_t --Tjk_msg_t --Tjk_msg_buf_t --Tjk_map_t --Tjk_uri_worker_map_t --Tjk_pool_t --Tjk_pool_atom_t --Tjk_logger_t --Tjk_ws_service_t --Tjk_context_item_t --Tjk_context_t --Tjk_login_service_t diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp12_worker.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp12_worker.o deleted file mode 100644 index 43f069c5..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp12_worker.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp13.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp13.o deleted file mode 100644 index 65a3b17c..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp13.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp13_worker.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp13_worker.o deleted file mode 100644 index 6964abbf..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp13_worker.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp14.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp14.o deleted file mode 100644 index 052f3ef2..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp14.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp14_worker.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp14_worker.o deleted file mode 100644 index 87fafdbf..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp14_worker.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp_common.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp_common.o deleted file mode 100644 index a20eca35..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp_common.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_connect.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_connect.o deleted file mode 100644 index 007bd0d3..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_connect.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_context.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_context.o deleted file mode 100644 index 48f29a7d..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_context.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_jni_worker.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_jni_worker.o deleted file mode 100644 index 01dc3d23..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_jni_worker.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_lb_worker.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_lb_worker.o deleted file mode 100644 index ed0cc246..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_lb_worker.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_map.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_map.o deleted file mode 100644 index 4ccd1aac..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_map.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_md5.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_md5.o deleted file mode 100644 index b9780541..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_md5.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_msg_buff.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_msg_buff.o deleted file mode 100644 index 7b0c05b4..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_msg_buff.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_pool.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_pool.o deleted file mode 100644 index 52c12aa9..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_pool.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_shm.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_shm.o deleted file mode 100644 index 96025d9f..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_shm.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_sockbuf.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_sockbuf.o deleted file mode 100644 index 248f7d0c..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_sockbuf.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_status.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_status.o deleted file mode 100644 index 763f6b40..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_status.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_uri_worker_map.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_uri_worker_map.o deleted file mode 100644 index 3d1c5b53..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_uri_worker_map.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_url.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_url.o deleted file mode 100644 index c0d52ee0..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_url.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_util.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_util.o deleted file mode 100644 index 0bfdc8b4..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_util.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_worker.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_worker.o deleted file mode 100644 index e6530d0d..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_worker.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/Makefile b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/Makefile deleted file mode 100644 index 880168d8..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/Makefile +++ /dev/null @@ -1,49 +0,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. - -#### XXXX DO we need this Makefile ???? -srcdir = . -top_srcdir = .. - -prefix = /usr/local -exec_prefix = ${prefix} -APXSLDFLAGS= -APXSCFLAGS= -g -O2 -pthread -DHAVE_APR -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include -DHAVE_CONFIG_H -DHAVE_JNI -APXSCPPFLAGS=-D_REENTRANT -D_GNU_SOURCE - -top_builddir = .. - -LIBTOOL = /bin/bash /bottlenecks/rubbos/app/apache2/build/libtool --silent -CC = gcc - -OEXT=.lo -include list.mk - -JAVA_INCL=-I /bottlenecks/rubbos/app/jdk1.6.0_27/include -I /bottlenecks/rubbos/app/jdk1.6.0_27/include/linux -CFLAGS=-I/bottlenecks/rubbos/app/apache2/include -DHAVE_CONFIG_H -DHAVE_JNI ${APXSCFLAGS} ${APXSCPPFLAGS} ${JAVA_INCL} - -include ../scripts/build/rules.mk - -JK=./ - -all: ${APACHE_OBJECTS} - -install: - -clean: - rm -f *.o *.lo *.a *.la *.so *.so.* *.slo - rm -rf .libs - -maintainer-clean: clean diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/Makefile.in b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/Makefile.in deleted file mode 100644 index 4304ae5f..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/Makefile.in +++ /dev/null @@ -1,49 +0,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. - -#### XXXX DO we need this Makefile ???? -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ -APXSLDFLAGS=@APXSLDFLAGS@ -APXSCFLAGS=@APXSCFLAGS@ -APXSCPPFLAGS=@APXSCPPFLAGS@ - -top_builddir = .. - -LIBTOOL = @LIBTOOL@ -CC = @CC@ - -OEXT=.lo -include list.mk - -JAVA_INCL=-I @JAVA_HOME@/include -I @JAVA_HOME@/include/@OS@ -CFLAGS=@apache_include@ @CFLAGS@ ${APXSCFLAGS} ${APXSCPPFLAGS} ${JAVA_INCL} - -include @top_srcdir@/scripts/build/rules.mk - -JK=./ - -all: ${APACHE_OBJECTS} - -install: - -clean: - rm -f *.o *.lo *.a *.la *.so *.so.* *.slo - rm -rf .libs - -maintainer-clean: clean diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/ap_snprintf.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/ap_snprintf.c deleted file mode 100644 index 18b539de..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/ap_snprintf.c +++ /dev/null @@ -1,1178 +0,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. - */ - -/* - * This code is based on, and used with the permission of, the - * SIO stdio-replacement strx_* functions by Panos Tsirigotis - * for xinetd. - */ -#define BUILD_STANDALONE - -#ifndef BUILD_STANDALONE -#include "httpd.h" -#else -#include "ap_snprintf.h" -#endif - -#include -#include -#ifndef NETWARE -#include -#endif -#include -#include -#include -#include -#ifdef WIN32 -#include -#endif - -typedef enum { - NO = 0, YES = 1 -} boolean_e; - -#ifndef FALSE -#define FALSE 0 -#endif -#ifndef TRUE -#define TRUE 1 -#endif -#ifndef AP_LONGEST_LONG -#define AP_LONGEST_LONG long -#endif -#define NUL '\0' -#define WIDE_INT long -#define WIDEST_INT AP_LONGEST_LONG - -typedef WIDE_INT wide_int; -typedef unsigned WIDE_INT u_wide_int; -typedef WIDEST_INT widest_int; -#ifdef __TANDEM -/* Although Tandem supports "long long" there is no unsigned variant. */ -typedef unsigned long u_widest_int; -#else -typedef unsigned WIDEST_INT u_widest_int; -#endif -typedef int bool_int; - -#define S_NULL "(null)" -#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 - * - * XXX: 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. - */ - -/* - * ap_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 *ap_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; - *decpt = r2; - if (p1 < &buf[0]) { - buf[0] = '\0'; - return (buf); - } - 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 *ap_ecvt(double arg, int ndigits, int *decpt, int *sign, char *buf) -{ - return (ap_cvt(arg, ndigits, decpt, sign, 1, buf)); -} - -static char *ap_fcvt(double arg, int ndigits, int *decpt, int *sign, char *buf) -{ - return (ap_cvt(arg, ndigits, decpt, sign, 0, buf)); -} - -/* - * ap_gcvt - Floating output conversion to - * minimal length string - */ - -static char *ap_gcvt(double number, int ndigit, char *buf, boolean_e altform) -{ - int sign, decpt; - register char *p1, *p2; - register int i; - char buf1[NDIG]; - - p1 = ap_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 >= 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 ( ap_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 && !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); -} - - - -#ifndef BUILD_STANDALONE -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_sockaddr_in(struct sockaddr_in *si, char *buf_end, int *len) -{ - char *p = buf_end; - bool_int is_negative; - int sub_len; - - p = conv_10(ntohs(si->sin_port), TRUE, &is_negative, p, &sub_len); - *--p = ':'; - p = conv_in_addr(&si->sin_addr, p, &sub_len); - - *len = buf_end - p; - return (p); -} -#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 = ap_fcvt(num, precision, &decimal_point, is_negative, buf1); - else /* either e or E format */ - p = ap_ecvt(num, precision + 1, &decimal_point, is_negative, buf1); - - /* - * Check for Infinity and NaN - */ - if (ap_isalpha(*p)) { - *len = strlen(strcpy(buf, p)); - *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 - */ -API_EXPORT(int) ap_vformatter(int (*flush_func)(ap_vformatter_buff *), - ap_vformatter_buff *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 - */ - 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 (!ap_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 (ap_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 (ap_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 (*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) { - s_len = strlen(s); - if (adjust_precision && precision < s_len) - s_len = precision; - } - 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 - */ -#ifdef HAVE_ISNAN - if (isnan(fp_num)) { - s = "nan"; - s_len = 3; - } - else -#endif -#ifdef HAVE_ISINF - if (isinf(fp_num)) { - s = "inf"; - s_len = 3; - } - else -#endif - { - 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 = ap_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; - 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': -#ifdef AP_VOID_P_IS_QUAD - 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; - -#ifndef BUILD_STANDALONE - /* print a struct sockaddr_in as a.b.c.d:port */ - case 'I': - { - struct sockaddr_in *si; - - si = va_arg(ap, struct sockaddr_in *); - if (si != NULL) { - s = conv_sockaddr_in(si, &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; -#endif - - case NUL: - /* if %p ends the string, oh well ignore it */ - continue; - - default: - s = "bogus %p"; - s_len = 8; - prefix_char = NUL; - 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. - */ - 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(ap_vformatter_buff *vbuff) -{ - /* if the buffer fills we have to abort immediately, there is no way - * to "flush" an ap_snprintf... there's nowhere to flush it to. - */ - return -1; -} - - -API_EXPORT_NONSTD(int) ap_snprintf(char *buf, size_t len, const char *format,...) -{ - int cc; - va_list ap; - ap_vformatter_buff vbuff; - - if (len == 0) - return 0; - - /* save one byte for nul terminator */ - vbuff.curpos = buf; - vbuff.endpos = buf + len - 1; - va_start(ap, format); - cc = ap_vformatter(snprintf_flush, &vbuff, format, ap); - va_end(ap); - *vbuff.curpos = '\0'; - return (cc == -1) ? len : cc; -} - - -API_EXPORT(int) ap_vsnprintf(char *buf, size_t len, const char *format, - va_list ap) -{ - int cc; - ap_vformatter_buff vbuff; - - if (len == 0) - return 0; - - /* save one byte for nul terminator */ - vbuff.curpos = buf; - vbuff.endpos = buf + len - 1; - cc = ap_vformatter(snprintf_flush, &vbuff, format, ap); - *vbuff.curpos = '\0'; - return (cc == -1) ? len : cc; -} diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/ap_snprintf.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/ap_snprintf.h deleted file mode 100644 index 73b3c6e5..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/ap_snprintf.h +++ /dev/null @@ -1,150 +0,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. - */ - -/* - * The ap_vsnprintf/ap_snprintf functions are based on, and used with the - * permission of, the SIO stdio-replacement strx_* functions by Panos - * Tsirigotis for xinetd. - */ - -#ifndef APACHE_AP_SNPRINTF_H -#define APACHE_AP_SNPRINTF_H - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* stuff marked API_EXPORT is part of the API, and intended for use - * by modules - */ -#ifndef API_EXPORT -#define API_EXPORT(type) type -#endif - -/* Stuff marked API_EXPORT_NONSTD is part of the API, and intended for - * use by modules. The difference between API_EXPORT and - * API_EXPORT_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. - */ -#ifndef API_EXPORT_NONSTD -#define API_EXPORT_NONSTD(type) type -#endif - -#if !defined(__GNUC__) || __GNUC__ < 2 || \ - (__GNUC__ == 2 && __GNUC_MINOR__ < 7) ||\ - defined(NEXT) -#define __attribute__(__x) -#endif - -/* 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. - */ -#define ap_isalpha(c) (isalpha(((unsigned char)(c)))) -#define ap_isdigit(c) (isdigit(((unsigned char)(c)))) -#define ap_islower(c) (islower(((unsigned char)(c)))) - - -/* ap_vformatter() is a generic printf-style formatting routine - * with some extensions. The extensions are: - * - * %pA takes a struct in_addr *, and prints it as a.b.c.d - * %pI takes a struct sockaddr_in * and prints it as a.b.c.d:port - * %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, ap_vformatter allows for arbitrary output methods - * using the ap_vformatter_buff and flush_func. - * - * The ap_vformatter_buff has two elements curpos and endpos. - * curpos is where ap_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, ap_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 ap_vformatter will return immediately with -1. Otherwise - * the flush_func should flush the buffer in whatever manner is - * appropriate, re-initialize 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 - * ap_vformatter returns. - * - * ap_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, ap_psprintf uses the "scratch" - * space at the unallocated end of a block, and doesn't actually - * complete the allocation until ap_vformatter returns. ap_psprintf - * would be completely broken if ap_vformatter were to call anything - * that used a 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 ap_vformatter returns. - */ - -typedef struct { - char *curpos; - char *endpos; -} ap_vformatter_buff; - -API_EXPORT(int) ap_vformatter(int (*flush_func)(ap_vformatter_buff *), - ap_vformatter_buff *, const char *fmt, va_list ap); - -/* These are snprintf implementations based on ap_vformatter(). - * - * Note that various standards and implementations disagree on the return - * value of snprintf, and side-effects due to %n in the formatting string. - * ap_snprintf 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. The return value - * is the number of characters placed in the buffer, excluding the - * terminating NUL. All this implies that, at most, (len-1) characters - * will be copied over; if the return value is >= len, then truncation - * occured. - * - * In no event does ap_snprintf return a negative number. - */ -API_EXPORT_NONSTD(int) ap_snprintf(char *buf, size_t len, const char *format,...) - __attribute__((format(printf,3,4))); -API_EXPORT(int) ap_vsnprintf(char *buf, size_t len, const char *format, - va_list ap); - -#ifdef __cplusplus -} -#endif - -#endif /* !APACHE_AP_SNPRINTF_H */ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/config.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/config.h deleted file mode 100644 index e92dec8d..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/config.h +++ /dev/null @@ -1,110 +0,0 @@ -/* common/config.h. Generated by configure. */ -/* common/config.h.in. Generated from configure.in by autoheader. */ - -/* Define to 1 if you have the header file. */ -#define HAVE_DLFCN_H 1 - -/* Have flock() */ -#define HAVE_FLOCK 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_INTTYPES_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_MEMORY_H 1 - -/* Have poll() */ -#define HAVE_POLL 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_POLL_H 1 - -/* Have snprintf() */ -#define HAVE_SNPRINTF 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. */ -/* #undef HAVE_SYS_FILIO_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_TYPES_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_UNISTD_H 1 - -/* Have vsnprintf() */ -#define HAVE_VSNPRINTF 1 - -/* Name of package */ -#define PACKAGE "mod_jk" - -/* 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 "" - -/* The size of a `char', as computed by sizeof. */ -#define SIZEOF_CHAR 1 - -/* The size of a `int', as computed by sizeof. */ -#define SIZEOF_INT 4 - -/* The size of a `long', as computed by sizeof. */ -#define SIZEOF_LONG 8 - -/* The size of a `longlong', as computed by sizeof. */ -#define SIZEOF_LONGLONG 0 - -/* The size of a `long double', as computed by sizeof. */ -#define SIZEOF_LONG_DOUBLE 16 - -/* The size of a `long long', as computed by sizeof. */ -#define SIZEOF_LONG_LONG 8 - -/* The size of pid_t */ -#define SIZEOF_PID_T 4 - -/* The size of pthread_t */ -#define SIZEOF_PTHREAD_T 8 - -/* The size of a `short', as computed by sizeof. */ -#define SIZEOF_SHORT 2 - -/* Define to 1 if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Define to use SOCK_CLOEXEC with socket() */ -#define USE_SOCK_CLOEXEC 1 - -/* Define to use SO_RCVTIMEO with setsockopt() */ -#define USE_SO_RCVTIMEO 1 - -/* Define to use SO_SNDTIMEO with setsockopt() */ -#define USE_SO_SNDTIMEO 1 - -/* Version number of package */ -#define VERSION "1.2.32" diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/config.h.in b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/config.h.in deleted file mode 100644 index 7426f4f6..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/config.h.in +++ /dev/null @@ -1,109 +0,0 @@ -/* common/config.h.in. Generated from configure.in by autoheader. */ - -/* Define to 1 if you have the header file. */ -#undef HAVE_DLFCN_H - -/* Have flock() */ -#undef HAVE_FLOCK - -/* Define to 1 if you have the header file. */ -#undef HAVE_INTTYPES_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_MEMORY_H - -/* Have poll() */ -#undef HAVE_POLL - -/* Define to 1 if you have the header file. */ -#undef HAVE_POLL_H - -/* Have snprintf() */ -#undef HAVE_SNPRINTF - -/* 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_FILIO_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 - -/* Have vsnprintf() */ -#undef HAVE_VSNPRINTF - -/* Name of package */ -#undef PACKAGE - -/* 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 - -/* The size of a `char', as computed by sizeof. */ -#undef SIZEOF_CHAR - -/* The size of a `int', as computed by sizeof. */ -#undef SIZEOF_INT - -/* The size of a `long', as computed by sizeof. */ -#undef SIZEOF_LONG - -/* The size of a `longlong', as computed by sizeof. */ -#undef SIZEOF_LONGLONG - -/* The size of a `long double', as computed by sizeof. */ -#undef SIZEOF_LONG_DOUBLE - -/* The size of a `long long', as computed by sizeof. */ -#undef SIZEOF_LONG_LONG - -/* The size of pid_t */ -#undef SIZEOF_PID_T - -/* The size of pthread_t */ -#undef SIZEOF_PTHREAD_T - -/* The size of a `short', as computed by sizeof. */ -#undef SIZEOF_SHORT - -/* Define to 1 if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* Define to use SOCK_CLOEXEC with socket() */ -#undef USE_SOCK_CLOEXEC - -/* Define to use SO_RCVTIMEO with setsockopt() */ -#undef USE_SO_RCVTIMEO - -/* Define to use SO_SNDTIMEO with setsockopt() */ -#undef USE_SO_SNDTIMEO - -/* Version number of package */ -#undef VERSION diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk.rc b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk.rc deleted file mode 100644 index e0eae360..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk.rc +++ /dev/null @@ -1,74 +0,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. - */ - -#include -#include "jk_version.h" - -#define ASF_COPYRIGHT "Licensed to the Apache Software Foundation " \ - "(ASF) under one or more contributor license " \ - "agreements. See the NOTICE file distributed " \ - "with this work for additional information " \ - "regarding copyright ownership." - -#define ASF_LICENSE "The ASF licenses this file to You under the " \ - "Apache License, Version 2.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." - - -1 VERSIONINFO - FILEVERSION JK_VERSIONCSV - PRODUCTVERSION JK_VERSIONCSV - FILEFLAGSMASK 0x3fL -#if defined(_DEBUG) - FILEFLAGS 0x01L -#else - FILEFLAGS 0x00L -#endif - FILEOS 0x40004L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "Comments", ASF_LICENSE "\0" - VALUE "CompanyName", "Apache Software Foundation\0" - VALUE "FileDescription", "Apache Tomcat Connector\0" - VALUE "FileVersion", JK_VERSTRING "\0" - VALUE "InternalName", PACKAGE "\0" - VALUE "LegalCopyright", ASF_COPYRIGHT "\0" - VALUE "OriginalFilename", PACKAGE "." JK_DLL_SUFFIX "\0" - VALUE "ProductName", "Apache Tomcat " PACKAGE " Connector\0" - VALUE "ProductVersion", JK_VERSTRING "\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.c deleted file mode 100644 index c10ef0b4..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.c +++ /dev/null @@ -1,682 +0,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. - */ - -/*************************************************************************** - * Description: ajpv1.2 worker, used to call local or remote jserv hosts * - * This worker is deprecated * - * Author: Gal Shachor * - * Based on: jserv_ajpv12.c from Jserv * - * Version: $Revision: 747878 $ * - ***************************************************************************/ - -#include "jk_ajp12_worker.h" -#include "jk_pool.h" -#include "jk_connect.h" -#include "jk_util.h" -#include "jk_sockbuf.h" -#if defined(AS400) && !defined(AS400_UTF8) -#include "util_ebcdic.h" -#include -#endif - -#define AJP_DEF_HOST ("localhost") -#define AJP_DEF_PORT (8007) -#define READ_BUF_SIZE (8*1024) -#define DEF_RETRY_ATTEMPTS (1) - -struct ajp12_worker -{ - struct sockaddr_in worker_inet_addr; - unsigned connect_retry_attempts; - char *name; - jk_worker_t worker; -}; - -typedef struct ajp12_worker ajp12_worker_t; - -struct ajp12_endpoint -{ - ajp12_worker_t *worker; - - jk_sock_t sd; - jk_sockbuf_t sb; - - jk_endpoint_t endpoint; -}; -typedef struct ajp12_endpoint ajp12_endpoint_t; - -static int ajpv12_mark(ajp12_endpoint_t * p, unsigned char type); - -#if defined(AS400) && !defined(AS400_UTF8) -static int ajpv12_sendasciistring(ajp12_endpoint_t * p, char *buffer); -#endif - -#if defined(AS400) && !defined(AS400_UTF8) -static int ajpv12_sendstring(ajp12_endpoint_t * p, char *buffer); -#else -static int ajpv12_sendstring(ajp12_endpoint_t * p, const char *buffer); -#endif - -static int ajpv12_sendint(ajp12_endpoint_t * p, int d); - -static int ajpv12_sendnbytes(ajp12_endpoint_t * p, - const void *buffer, int bufferlen); - -static int ajpv12_flush(ajp12_endpoint_t * p); - -static int ajpv12_handle_response(ajp12_endpoint_t * p, - jk_ws_service_t *s, jk_logger_t *l); - -static int ajpv12_handle_request(ajp12_endpoint_t * p, - jk_ws_service_t *s, jk_logger_t *l); - -/* - * Return values of service() method for ajp12 worker: - * return value is_error reason - * JK_FALSE JK_HTTP_SERVER_ERROR Invalid parameters (null values) - * Error during connect to the backend - * ajpv12_handle_request() returns false: - * Any error during reading a request body from the client or - * sending the request to the backend - * JK_FALSE JK_HTTP_OK ajpv12_handle_response() returns false: - * Any error during reading parts of response from backend or - * sending to client - * JK_TRUE JK_HTTP_OK All other cases - */ -static int JK_METHOD service(jk_endpoint_t *e, - jk_ws_service_t *s, - jk_logger_t *l, int *is_error) -{ - ajp12_endpoint_t *p; - unsigned int attempt; - int rc = -1; - /* - * AJP12 protocol is not recoverable. - */ - - JK_TRACE_ENTER(l); - - if (!e || !e->endpoint_private || !s || !is_error) { - JK_LOG_NULL_PARAMS(l); - if (is_error) - *is_error = JK_HTTP_SERVER_ERROR; - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - p = e->endpoint_private; - - /* Set returned error to OK */ - *is_error = JK_HTTP_OK; - - for (attempt = 0; attempt < p->worker->connect_retry_attempts; - attempt++) { - p->sd = - jk_open_socket(&p->worker->worker_inet_addr, - JK_FALSE, 0, 0, 0, l); - - jk_log(l, JK_LOG_DEBUG, "In jk_endpoint_t::service, sd = %d", - p->sd); - if (IS_VALID_SOCKET(p->sd)) { - break; - } - } - if (IS_VALID_SOCKET(p->sd)) { - - jk_sb_open(&p->sb, p->sd); - if (ajpv12_handle_request(p, s, l)) { - jk_log(l, JK_LOG_DEBUG, - "In jk_endpoint_t::service, sent request"); - rc = ajpv12_handle_response(p, s, l); - JK_TRACE_EXIT(l); - return rc; - } - } - jk_log(l, JK_LOG_ERROR, "In jk_endpoint_t::service, Error sd = %d", - p->sd); - *is_error = JK_HTTP_SERVER_ERROR; - - JK_TRACE_EXIT(l); - return JK_FALSE; -} - -static int JK_METHOD done(jk_endpoint_t **e, jk_logger_t *l) -{ - jk_log(l, JK_LOG_DEBUG, "Into jk_endpoint_t::done"); - if (e && *e && (*e)->endpoint_private) { - ajp12_endpoint_t *p = (*e)->endpoint_private; - if (IS_VALID_SOCKET(p->sd)) { - jk_shutdown_socket(p->sd, l); - } - free(p); - *e = NULL; - return JK_TRUE; - } - - jk_log(l, JK_LOG_ERROR, "In jk_endpoint_t::done, NULL parameters"); - return JK_FALSE; -} - -static int JK_METHOD validate(jk_worker_t *pThis, - jk_map_t *props, - jk_worker_env_t *we, jk_logger_t *l) -{ - jk_log(l, JK_LOG_DEBUG, "Into jk_worker_t::validate"); - - if (pThis && pThis->worker_private) { - ajp12_worker_t *p = pThis->worker_private; - int port = jk_get_worker_port(props, - p->name, - AJP_DEF_PORT); - - const char *host = jk_get_worker_host(props, - p->name, - AJP_DEF_HOST); - - jk_log(l, JK_LOG_DEBUG, - "In jk_worker_t::validate for worker %s contact is %s:%d", - p->name, host, port); - - if (host) { - if (jk_resolve(host, port, &p->worker_inet_addr, we->pool, l)) { - return JK_TRUE; - } - jk_log(l, JK_LOG_ERROR, - "In jk_worker_t::validate, resolve failed"); - } - jk_log(l, JK_LOG_ERROR, "In jk_worker_t::validate, Error %s %d", - host, port); - } - else { - jk_log(l, JK_LOG_ERROR, - "In jk_worker_t::validate, NULL parameters"); - } - - return JK_FALSE; -} - -static int JK_METHOD init(jk_worker_t *pThis, - jk_map_t *props, - jk_worker_env_t *we, jk_logger_t *log) -{ - /* Nothing to do for now */ - return JK_TRUE; -} - -static int JK_METHOD get_endpoint(jk_worker_t *pThis, - jk_endpoint_t **pend, jk_logger_t *l) -{ - jk_log(l, JK_LOG_DEBUG, "Into jk_worker_t::get_endpoint"); - - if (pThis && pThis->worker_private && pend) { - ajp12_endpoint_t *p = - (ajp12_endpoint_t *) malloc(sizeof(ajp12_endpoint_t)); - if (p) { - p->sd = JK_INVALID_SOCKET; - p->worker = pThis->worker_private; - p->endpoint.endpoint_private = p; - p->endpoint.service = service; - p->endpoint.done = done; - *pend = &p->endpoint; - return JK_TRUE; - } - jk_log(l, JK_LOG_ERROR, - "In jk_worker_t::get_endpoint, malloc failed"); - } - else { - jk_log(l, JK_LOG_ERROR, - "In jk_worker_t::get_endpoint, NULL parameters"); - } - - return JK_FALSE; -} - -static int JK_METHOD destroy(jk_worker_t **pThis, jk_logger_t *l) -{ - jk_log(l, JK_LOG_DEBUG, "Into jk_worker_t::destroy"); - if (pThis && *pThis && (*pThis)->worker_private) { - ajp12_worker_t *private_data = (*pThis)->worker_private; - free(private_data->name); - free(private_data); - - return JK_TRUE; - } - - jk_log(l, JK_LOG_ERROR, "In jk_worker_t::destroy, NULL parameters"); - return JK_FALSE; -} - -int JK_METHOD ajp12_worker_factory(jk_worker_t **w, - const char *name, jk_logger_t *l) -{ - jk_log(l, JK_LOG_DEBUG, "Into ajp12_worker_factory"); - if (NULL != name && NULL != w) { - ajp12_worker_t *private_data = - (ajp12_worker_t *) malloc(sizeof(ajp12_worker_t)); - - if (private_data) { - private_data->name = strdup(name); - - if (private_data->name) { - private_data->connect_retry_attempts = DEF_RETRY_ATTEMPTS; - private_data->worker.worker_private = private_data; - - private_data->worker.validate = validate; - private_data->worker.init = init; - private_data->worker.get_endpoint = get_endpoint; - private_data->worker.destroy = destroy; - private_data->worker.maintain = NULL; - - *w = &private_data->worker; - return JK_AJP12_WORKER_TYPE; - } - - free(private_data); - } - jk_log(l, JK_LOG_ERROR, "In ajp12_worker_factory, malloc failed"); - } - else { - jk_log(l, JK_LOG_ERROR, "In ajp12_worker_factory, NULL parameters"); - } - - return 0; -} - -static int ajpv12_sendnbytes(ajp12_endpoint_t * p, - const void *buffer, int bufferlen) -{ - unsigned char bytes[2]; - static const unsigned char null_b[2] = - { (unsigned char)0xff, (unsigned char)0xff }; - - if (buffer) { - bytes[0] = (unsigned char)((bufferlen >> 8) & 0xff); - bytes[1] = (unsigned char)(bufferlen & 0xff); - - if (jk_sb_write(&p->sb, bytes, 2)) { - return jk_sb_write(&p->sb, buffer, bufferlen); - } - else { - return JK_FALSE; - } - } - else { - return jk_sb_write(&p->sb, null_b, 2); - } -} - -#if defined(AS400) && !defined(AS400_UTF8) -static int ajpv12_sendasciistring(ajp12_endpoint_t * p, const char *buffer) -{ - int bufferlen; - - if (buffer && (bufferlen = strlen(buffer))) { - return ajpv12_sendnbytes(p, buffer, bufferlen); - } - else { - return ajpv12_sendnbytes(p, NULL, 0); - } -} -#endif - -static int ajpv12_sendstring(ajp12_endpoint_t * p, const char *buffer) -{ - int bufferlen; - - if (buffer && (bufferlen = (int)strlen(buffer))) { -#if (defined(AS400) && !defined(AS400_UTF8)) || defined(_OSD_POSIX) - char buf[2048]; - if (bufferlen < 2048) { - memcpy(buf, buffer, bufferlen); - jk_xlate_to_ascii(buf, bufferlen); - return ajpv12_sendnbytes(p, buf, bufferlen); - } - else - return -1; -#else - return ajpv12_sendnbytes(p, buffer, bufferlen); -#endif - } - else { - return ajpv12_sendnbytes(p, NULL, 0); - } -} - -static int ajpv12_mark(ajp12_endpoint_t * p, unsigned char type) -{ - if (jk_sb_write(&p->sb, &type, 1)) { - return JK_TRUE; - } - else { - return JK_FALSE; - } -} - -static int ajpv12_sendint(ajp12_endpoint_t * p, int d) -{ - char buf[20]; - sprintf(buf, "%d", d); - return ajpv12_sendstring(p, buf); -} - -static int ajpv12_flush(ajp12_endpoint_t * p) -{ - return jk_sb_flush(&p->sb); -} - -static int ajpv12_handle_request(ajp12_endpoint_t * p, - jk_ws_service_t *s, jk_logger_t *l) -{ - int ret; - - jk_log(l, JK_LOG_DEBUG, "Into ajpv12_handle_request"); - /* - * Start the ajp 12 service sequence - */ - jk_log(l, JK_LOG_DEBUG, - "ajpv12_handle_request, sending the ajp12 start sequence"); - - ret = (ajpv12_mark(p, 1) && ajpv12_sendstring(p, s->method) && ajpv12_sendstring(p, 0) && /* zone */ - ajpv12_sendstring(p, 0) && /* servlet */ - ajpv12_sendstring(p, s->server_name) && ajpv12_sendstring(p, 0) && /* doc root */ - ajpv12_sendstring(p, 0) && /* path info */ - ajpv12_sendstring(p, 0) && /* path translated */ -#if defined(AS400) && !defined(AS400_UTF8) - ajpv12_sendasciistring(p, s->query_string) && -#else - ajpv12_sendstring(p, s->query_string) && -#endif - ajpv12_sendstring(p, s->remote_addr) && - ajpv12_sendstring(p, s->remote_host) && - ajpv12_sendstring(p, s->remote_user) && - ajpv12_sendstring(p, s->auth_type) && - ajpv12_sendint(p, s->server_port) && -#if defined(AS400) && !defined(AS400_UTF8) - ajpv12_sendasciistring(p, s->method) && -#else - ajpv12_sendstring(p, s->method) && -#endif - ajpv12_sendstring(p, s->req_uri) && ajpv12_sendstring(p, 0) && /* */ - ajpv12_sendstring(p, 0) && /* SCRIPT_NAME */ -#if defined(AS400) && !defined(AS400_UTF8) - ajpv12_sendasciistring(p, s->server_name) && -#else - ajpv12_sendstring(p, s->server_name) && -#endif - ajpv12_sendint(p, s->server_port) && ajpv12_sendstring(p, s->protocol) && ajpv12_sendstring(p, 0) && /* SERVER_SIGNATURE */ - ajpv12_sendstring(p, s->server_software) && ajpv12_sendstring(p, s->route) && /* JSERV_ROUTE */ - ajpv12_sendstring(p, "") && /* JSERV ajpv12 compatibility */ - ajpv12_sendstring(p, "")); /* JSERV ajpv12 compatibility */ - - if (!ret) { - jk_log(l, JK_LOG_ERROR, - "In ajpv12_handle_request, failed to send the ajp12 start sequence"); - return JK_FALSE; - } - - if (s->num_attributes > 0) { - unsigned i; - jk_log(l, JK_LOG_DEBUG, - "ajpv12_handle_request, sending the environment variables"); - - for (i = 0; i < s->num_attributes; i++) { - ret = (ajpv12_mark(p, 5) && - ajpv12_sendstring(p, s->attributes_names[i]) && - ajpv12_sendstring(p, s->attributes_values[i])); - if (!ret) { - jk_log(l, JK_LOG_ERROR, - "In ajpv12_handle_request, failed to send environment"); - return JK_FALSE; - } - } - } - - jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_request, sending the headers"); - - /* Send the request headers */ - if (s->num_headers) { - unsigned i; - for (i = 0; i < s->num_headers; ++i) { - ret = (ajpv12_mark(p, 3) && - ajpv12_sendstring(p, s->headers_names[i]) && - ajpv12_sendstring(p, s->headers_values[i])); - - if (!ret) { - jk_log(l, JK_LOG_ERROR, - "In ajpv12_handle_request, failed to send headers"); - return JK_FALSE; - } - } - } - - jk_log(l, JK_LOG_DEBUG, - "ajpv12_handle_request, sending the terminating mark"); - - ret = (ajpv12_mark(p, 4) && ajpv12_flush(p)); - if (!ret) { - jk_log(l, JK_LOG_ERROR, - "In ajpv12_handle_request, failed to send the terminating mark"); - return JK_FALSE; - } - - if (s->content_length) { - char buf[READ_BUF_SIZE]; - jk_uint64_t so_far = 0; - - jk_log(l, JK_LOG_DEBUG, - "ajpv12_handle_request, sending the request body"); - - while (so_far < s->content_length) { - unsigned this_time = 0; - unsigned to_read; - if (s->content_length > so_far + READ_BUF_SIZE) { - to_read = READ_BUF_SIZE; - } - else { - to_read = (unsigned int)(s->content_length - so_far); - } - - if (!s->read(s, buf, to_read, &this_time)) { - jk_log(l, JK_LOG_ERROR, - "In ajpv12_handle_request, failed to read from the web server"); - return JK_FALSE; - } - jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_request, read %d bytes", - this_time); - if (this_time > 0) { - so_far += this_time; - if ((int)this_time != send(p->sd, buf, this_time, 0)) { - jk_log(l, JK_LOG_ERROR, - "In ajpv12_handle_request, failed to write to the container"); - return JK_FALSE; - } - jk_log(l, JK_LOG_DEBUG, - "ajpv12_handle_request, sent %d bytes", this_time); - } - else if (this_time == 0) { - jk_log(l, JK_LOG_ERROR, - "In ajpv12_handle_request, Error: short read. content length is %" JK_UINT64_T_FMT ", read %" JK_UINT64_T_FMT, - s->content_length, so_far); - return JK_FALSE; - } - } - } - - jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_request done"); - return JK_TRUE; -} - -static int ajpv12_handle_response(ajp12_endpoint_t * p, - jk_ws_service_t *s, jk_logger_t *l) -{ - int status = 200; - char *reason = NULL; - char **names = NULL; - char **values = NULL; - int headers_capacity = 0; - int headers_len = 0; - int write_to_ws; - - jk_log(l, JK_LOG_DEBUG, "Into ajpv12_handle_response"); - /* - * Read headers ... - */ - while (1) { - char *line = NULL; - char *name = NULL; - char *value = NULL; -#ifdef _MT_CODE_PTHREAD - char *lasts; -#endif - - if (!jk_sb_gets(&p->sb, &line)) { - jk_log(l, JK_LOG_ERROR, - "ajpv12_handle_response, error reading header line"); - return JK_FALSE; - } -#if (defined(AS400) && !defined(AS400_UTF8)) || defined(_OSD_POSIX) - jk_xlate_from_ascii(line, strlen(line)); -#endif - - jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_response, read %s", line); - if (0 == strlen(line)) { - jk_log(l, JK_LOG_DEBUG, - "ajpv12_handle_response, headers are done"); - break; /* Empty line -> end of headers */ - } - - name = line; - while (isspace((int)(*name)) && *name) { - name++; /* Skip leading white chars */ - } - if (!*name) { /* Empty header name */ - jk_log(l, JK_LOG_ERROR, - "ajpv12_handle_response, empty header name"); - return JK_FALSE; - } - if (!(value = strchr(name, ':'))) { - jk_log(l, JK_LOG_ERROR, - "ajpv12_handle_response, no value supplied"); - return JK_FALSE; /* No value !!! */ - } - *value = '\0'; - value++; - while (isspace((int)(*value)) && *value) { - value++; /* Skip leading white chars */ - } - if (!*value) { /* Empty header value */ - jk_log(l, JK_LOG_ERROR, - "ajpv12_handle_response, empty header value"); - return JK_FALSE; - } - - jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_response, read %s=%s", name, - value); - if (0 == strcmp("Status", name)) { -#ifdef _MT_CODE_PTHREAD - char *numeric = strtok_r(value, " \t", &lasts); -#else - char *numeric = strtok(value, " \t"); -#endif - - status = atoi(numeric); - if (status < 100 || status > 999) { - jk_log(l, JK_LOG_ERROR, - "ajpv12_handle_response, invalid status code"); - return JK_FALSE; - } -#ifdef _MT_CODE_PTHREAD - reason = jk_pool_strdup(s->pool, strtok_r(NULL, " \t", &lasts)); -#else - reason = jk_pool_strdup(s->pool, strtok(NULL, " \t")); -#endif - } - else { - if (headers_capacity == headers_len) { - jk_log(l, JK_LOG_DEBUG, - "ajpv12_handle_response, allocating header arrays"); - names = - (char **)jk_pool_realloc(s->pool, - sizeof(char *) * - (headers_capacity + 5), names, - sizeof(char *) * - headers_capacity); - values = - (char **)jk_pool_realloc(s->pool, - sizeof(char *) * - (headers_capacity + 5), values, - sizeof(char *) * - headers_capacity); - if (!values || !names) { - jk_log(l, JK_LOG_ERROR, - "ajpv12_handle_response, malloc error"); - return JK_FALSE; - } - headers_capacity = headers_capacity + 5; - } - names[headers_len] = jk_pool_strdup(s->pool, name); - values[headers_len] = jk_pool_strdup(s->pool, value); - headers_len++; - } - } - - jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_response, starting response"); - if (!s->start_response(s, - status, - reason, - (const char *const *)names, - (const char *const *)values, headers_len)) { - jk_log(l, JK_LOG_ERROR, - "ajpv12_handle_response, error starting response"); - return JK_FALSE; - } - - jk_log(l, JK_LOG_DEBUG, - "ajpv12_handle_response, reading response body"); - /* - * Read response body - */ - write_to_ws = JK_TRUE; - while (1) { - unsigned to_read = READ_BUF_SIZE; - unsigned acc = 0; - char *buf = NULL; - - if (!jk_sb_read(&p->sb, &buf, to_read, &acc)) { - jk_log(l, JK_LOG_ERROR, - "ajpv12_handle_response, error reading from "); - return JK_FALSE; - } - - if (!acc) { - jk_log(l, JK_LOG_DEBUG, - "ajpv12_handle_response, response body is done"); - break; - } - - if (write_to_ws) { - if (!s->write(s, buf, acc)) { - jk_log(l, JK_LOG_ERROR, - "ajpv12_handle_response, error writing back to server"); - write_to_ws = JK_FALSE; - } - } - } - - jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_response done"); - return JK_TRUE; -} diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.h deleted file mode 100644 index e4e5eaca..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.h +++ /dev/null @@ -1,45 +0,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. - */ - -/*************************************************************************** - * Description: ajpv1.2 worker header file * - * Author: Gal Shachor * - * Version: $Revision: 466585 $ * - ***************************************************************************/ - -#ifndef JK_AJP12_WORKER_H -#define JK_AJP12_WORKER_H - -#include "jk_logger.h" -#include "jk_service.h" - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -#define JK_AJP12_WORKER_NAME ("ajp12") -#define JK_AJP12_WORKER_TYPE (1) - -int JK_METHOD ajp12_worker_factory(jk_worker_t **w, - const char *name, jk_logger_t *l); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* JK_AJP12_WORKER_H */ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.lo deleted file mode 100644 index 9c11bcb9..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.lo +++ /dev/null @@ -1,12 +0,0 @@ -# jk_ajp12_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/jk_ajp12_worker.o' - -# Name of the non-PIC object. -non_pic_object='jk_ajp12_worker.o' - diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.o deleted file mode 100644 index 3ab1134b..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.c deleted file mode 100644 index 4c16a023..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.c +++ /dev/null @@ -1,50 +0,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. - */ - -/*************************************************************************** - * Description: Experimental bi-directionl protocol handler. * - * Author: Gal Shachor * - * Author: Henri Gomez * - * Version: $Revision: 466585 $ * - ***************************************************************************/ - - -#include "jk_global.h" -#include "jk_util.h" -#include "jk_ajp_common.h" -#include "jk_ajp13.h" - -int ajp13_marshal_shutdown_into_msgb(jk_msg_buf_t *msg, - jk_pool_t *p, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - /* To be on the safe side */ - jk_b_reset(msg); - - /* - * Just a single byte with s/d command. - */ - if (jk_b_append_byte(msg, JK_AJP13_SHUTDOWN)) { - jk_log(l, JK_LOG_ERROR, - "failed appending shutdown message"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - JK_TRACE_EXIT(l); - return JK_TRUE; -} diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.h deleted file mode 100644 index d2a9ab2e..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.h +++ /dev/null @@ -1,126 +0,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. - */ - -/*************************************************************************** - * Description: Experimental bi-directionl protocol handler. * - * Author: Gal Shachor * - * Version: $Revision: 751213 $ * - ***************************************************************************/ -#ifndef JK_AJP13_H -#define JK_AJP13_H - -#include "jk_ajp_common.h" - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -#define AJP13_PROTO 13 -#define AJP13_WS_HEADER 0x1234 -#define AJP13_SW_HEADER 0x4142 /* 'AB' */ - -#define AJP13_DEF_HOST ("localhost") -#define AJP13_DEF_PORT (8009) -#define AJP13_READ_BUF_SIZE (8*1024) -#define AJP13_DEF_CACHE_SZ (1) -#define JK_INTERNAL_ERROR (-2) -#define JK_FATAL_ERROR (-3) -#define JK_CLIENT_ERROR (-4) -#define JK_SERVER_ERROR (-5) -#define JK_CLIENT_RD_ERROR (-6) -#define JK_CLIENT_WR_ERROR (-7) -#define JK_STATUS_ERROR (-8) -#define JK_STATUS_FATAL_ERROR (-9) -#define JK_REPLY_TIMEOUT (-10) -#define JK_AJP_PROTOCOL_ERROR (-11) - -#define AJP13_MAX_SEND_BODY_SZ (DEF_BUFFER_SZ - 6) -#define AJP13_DEF_TIMEOUT (0) /* Idle timout for pooled connections */ - -/* - * Message does not have a response (for example, JK_AJP13_END_RESPONSE) - */ -#define JK_AJP13_ERROR -1 -/* - * Message does not have a response (for example, JK_AJP13_END_RESPONSE) - */ -#define JK_AJP13_NO_RESPONSE 0 -/* - * Message have a response. - */ -#define JK_AJP13_HAS_RESPONSE 1 - -/* - * Forward a request from the web server to the servlet container. - */ -#define JK_AJP13_FORWARD_REQUEST (unsigned char)2 - -/* - * Write a body chunk from the servlet container to the web server - */ -#define JK_AJP13_SEND_BODY_CHUNK (unsigned char)3 - -/* - * Send response headers from the servlet container to the web server. - */ -#define JK_AJP13_SEND_HEADERS (unsigned char)4 - -/* - * Marks the end of response. - */ -#define JK_AJP13_END_RESPONSE (unsigned char)5 - -/* - * Marks the end of response. - */ -#define JK_AJP13_GET_BODY_CHUNK (unsigned char)6 - -/* - * Asks the container to shutdown - */ -#define JK_AJP13_SHUTDOWN (unsigned char)7 - -/* - * Told container to take control (secure login phase) - */ -#define AJP13_PING_REQUEST (unsigned char)8 - -/* - * Check if the container is alive - */ -#define AJP13_CPING_REQUEST (unsigned char)10 - -/* - * Reply from the container to alive request - */ -#define AJP13_CPONG_REPLY (unsigned char)9 - - - -/* - * Functions - */ - -int ajp13_marshal_shutdown_into_msgb(jk_msg_buf_t *msg, - jk_pool_t *p, jk_logger_t *l); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* JK_AJP13_H */ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.lo deleted file mode 100644 index 33d31154..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.lo +++ /dev/null @@ -1,12 +0,0 @@ -# jk_ajp13.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/jk_ajp13.o' - -# Name of the non-PIC object. -non_pic_object='jk_ajp13.o' - diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.o deleted file mode 100644 index 872b5f5f..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.c deleted file mode 100644 index 13e140ff..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.c +++ /dev/null @@ -1,94 +0,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. - */ - -/*************************************************************************** - * Description: Bi-directional protocol. * - * Author: Costin * - * Author: Gal Shachor * - * Author: Henri Gomez * - * Version: $Revision: 611589 $ * - ***************************************************************************/ - -#include "jk_ajp13_worker.h" - - -/* -------------------- Method -------------------- */ -static int JK_METHOD validate(jk_worker_t *pThis, - jk_map_t *props, - jk_worker_env_t *we, jk_logger_t *l) -{ - int rc; - JK_TRACE_ENTER(l); - rc = ajp_validate(pThis, props, we, l, AJP13_PROTO); - JK_TRACE_EXIT(l); - return rc; -} - - -static int JK_METHOD init(jk_worker_t *pThis, - jk_map_t *props, - jk_worker_env_t *we, jk_logger_t *l) -{ - int rc; - JK_TRACE_ENTER(l); - - rc = ajp_init(pThis, props, we, l, AJP13_PROTO); - JK_TRACE_EXIT(l); - return rc; -} - - -static int JK_METHOD destroy(jk_worker_t **pThis, jk_logger_t *l) -{ - int rc; - JK_TRACE_ENTER(l); - rc = ajp_destroy(pThis, l, AJP13_PROTO); - JK_TRACE_EXIT(l); - return rc; -} - - -static int JK_METHOD get_endpoint(jk_worker_t *pThis, - jk_endpoint_t **pend, jk_logger_t *l) -{ - int rc; - JK_TRACE_ENTER(l); - rc = ajp_get_endpoint(pThis, pend, l, AJP13_PROTO); - JK_TRACE_EXIT(l); - return rc; -} - -int JK_METHOD ajp13_worker_factory(jk_worker_t **w, - const char *name, jk_logger_t *l) -{ - ajp_worker_t *aw; - - JK_TRACE_ENTER(l); - if (ajp_worker_factory(w, name, l) == JK_FALSE) - return 0; - - aw = (*w)->worker_private; - aw->proto = AJP13_PROTO; - - aw->worker.validate = validate; - aw->worker.init = init; - aw->worker.get_endpoint = get_endpoint; - aw->worker.destroy = destroy; - - JK_TRACE_EXIT(l); - return JK_AJP13_WORKER_TYPE; -} diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.h deleted file mode 100644 index b3098d6f..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.h +++ /dev/null @@ -1,50 +0,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. - */ - -/*************************************************************************** - * Description: ajpv1.3 worker header file * - * Author: Gal Shachor * - * Version: $Revision: 466585 $ * - ***************************************************************************/ - -#ifndef JK_AJP13_WORKER_H -#define JK_AJP13_WORKER_H - -#include "jk_pool.h" -#include "jk_connect.h" -#include "jk_util.h" -#include "jk_msg_buff.h" -#include "jk_ajp_common.h" -#include "jk_ajp13.h" -#include "jk_logger.h" - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -#define JK_AJP13_WORKER_NAME ("ajp13") -#define JK_AJP13_WORKER_TYPE (2) - -int JK_METHOD ajp13_worker_factory(jk_worker_t **w, - const char *name, jk_logger_t *l); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* JK_AJP13_WORKER_H */ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.lo deleted file mode 100644 index 415f71ae..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.lo +++ /dev/null @@ -1,12 +0,0 @@ -# jk_ajp13_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/jk_ajp13_worker.o' - -# Name of the non-PIC object. -non_pic_object='jk_ajp13_worker.o' - diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.o deleted file mode 100644 index b8f3d642..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.c deleted file mode 100644 index 161356ab..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.c +++ /dev/null @@ -1,695 +0,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. - */ - -/*************************************************************************** - * Description: Next generation bi-directional protocol handler. * - * Author: Henri Gomez * - * Version: $Revision: 466585 $ * - ***************************************************************************/ - - -#include "jk_global.h" -#include "jk_util.h" -#include "jk_map.h" -#include "jk_ajp_common.h" -#include "jk_ajp14.h" -#include "jk_md5.h" - -/* - * Compute the MD5 with ENTROPY / SECRET KEY - */ - -void ajp14_compute_md5(jk_login_service_t *s, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - jk_md5((const unsigned char *)s->entropy, - (const unsigned char *)s->secret_key, s->computed_key); - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, "(%s/%s) -> (%s)", - s->entropy, s->secret_key, s->computed_key); - JK_TRACE_EXIT(l); -} - - -/* - * Build the Login Init Command - * - * +-------------------------+---------------------------+---------------------------+ - * | LOGIN INIT CMD (1 byte) | NEGOCIATION DATA (32bits) | WEB SERVER INFO (CString) | - * +-------------------------+---------------------------+---------------------------+ - * - */ - -int ajp14_marshal_login_init_into_msgb(jk_msg_buf_t *msg, - jk_login_service_t *s, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - /* To be on the safe side */ - jk_b_reset(msg); - - /* - * LOGIN - */ - if (jk_b_append_byte(msg, AJP14_LOGINIT_CMD)) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - /* - * NEGOCIATION FLAGS - */ - if (jk_b_append_long(msg, s->negociation)) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - /* - * WEB-SERVER NAME - */ - if (jk_b_append_string(msg, s->web_server_name)) { - jk_log(l, JK_LOG_ERROR, - "failed appending the web_server_name string"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - - -/* - * Decode the Login Seed Command - * - * +-------------------------+---------------------------+ - * | LOGIN SEED CMD (1 byte) | MD5 of entropy (32 chars) | - * +-------------------------+---------------------------+ - * - */ - -int ajp14_unmarshal_login_seed(jk_msg_buf_t *msg, - jk_login_service_t *s, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - - if (jk_b_get_bytes - (msg, (unsigned char *)s->entropy, AJP14_ENTROPY_SEED_LEN) < 0) { - jk_log(l, JK_LOG_ERROR, - "can't get seed"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - s->entropy[AJP14_ENTROPY_SEED_LEN] = 0; /* Just to have a CString */ - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -/* - * Build the Login Computed Command - * - * +-------------------------+---------------------------------------+ - * | LOGIN COMP CMD (1 byte) | MD5 of RANDOM + SECRET KEY (32 chars) | - * +-------------------------+---------------------------------------+ - * - */ - -int ajp14_marshal_login_comp_into_msgb(jk_msg_buf_t *msg, - jk_login_service_t *s, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - - /* To be on the safe side */ - jk_b_reset(msg); - - /* - * LOGIN - */ - if (jk_b_append_byte(msg, AJP14_LOGCOMP_CMD)) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - /* - * COMPUTED-SEED - */ - if (jk_b_append_bytes - (msg, (const unsigned char *)s->computed_key, - AJP14_COMPUTED_KEY_LEN)) { - jk_log(l, JK_LOG_ERROR, - "failed appending the COMPUTED MD5 bytes"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - - -/* - * Decode the LogOk Command - * - * +--------------------+------------------------+-------------------------------+ - * | LOGOK CMD (1 byte) | NEGOCIED DATA (32bits) | SERVLET ENGINE INFO (CString) | - * +--------------------+------------------------+-------------------------------+ - * - */ - -int ajp14_unmarshal_log_ok(jk_msg_buf_t *msg, - jk_login_service_t *s, jk_logger_t *l) -{ - unsigned long nego; - char *sname; - - JK_TRACE_ENTER(l); - - nego = jk_b_get_long(msg); - - if (nego == 0xFFFFFFFF) { - jk_log(l, JK_LOG_ERROR, - "can't get negociated data"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - sname = (char *)jk_b_get_string(msg); - - if (!sname) { - jk_log(l, JK_LOG_ERROR, - "can't get servlet engine name"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (s->servlet_engine_name) /* take care of removing previously allocated data */ - free(s->servlet_engine_name); - - s->servlet_engine_name = strdup(sname); - - if (!s->servlet_engine_name) { - jk_log(l, JK_LOG_ERROR, - "can't malloc servlet engine name"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - - -/* - * Decode the Log Nok Command - * - * +---------------------+-----------------------+ - * | LOGNOK CMD (1 byte) | FAILURE CODE (32bits) | - * +---------------------+-----------------------+ - * - */ - -int ajp14_unmarshal_log_nok(jk_msg_buf_t *msg, jk_logger_t *l) -{ - unsigned long status; - - JK_TRACE_ENTER(l); - - status = jk_b_get_long(msg); - - if (status == 0xFFFFFFFF) { - jk_log(l, JK_LOG_ERROR, - "can't get failure code"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - jk_log(l, JK_LOG_INFO, "Can't Log with servlet engine - code %08lx", - status); - JK_TRACE_EXIT(l); - return JK_TRUE; -} - - -/* - * Build the Shutdown Cmd - * - * +-----------------------+---------------------------------------+ - * | SHUTDOWN CMD (1 byte) | MD5 of RANDOM + SECRET KEY (32 chars) | - * +-----------------------+---------------------------------------+ - * - */ - -int ajp14_marshal_shutdown_into_msgb(jk_msg_buf_t *msg, - jk_login_service_t *s, jk_logger_t *l) -{ - - JK_TRACE_ENTER(l); - - /* To be on the safe side */ - jk_b_reset(msg); - - /* - * SHUTDOWN CMD - */ - if (jk_b_append_byte(msg, AJP14_SHUTDOWN_CMD)) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - /* - * COMPUTED-SEED - */ - if (jk_b_append_bytes - (msg, (const unsigned char *)s->computed_key, - AJP14_COMPUTED_KEY_LEN)) { - jk_log(l, JK_LOG_ERROR, - "failed appending the COMPUTED MD5 bytes"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -/* - * Decode the Shutdown Nok Command - * - * +----------------------+-----------------------+ - * | SHUTNOK CMD (1 byte) | FAILURE CODE (32bits) | - * +----------------------+-----------------------+ - * - */ -int ajp14_unmarshal_shutdown_nok(jk_msg_buf_t *msg, jk_logger_t *l) -{ - unsigned long status; - - JK_TRACE_ENTER(l); - status = jk_b_get_long(msg); - - if (status == 0xFFFFFFFF) { - jk_log(l, JK_LOG_ERROR, - "can't get failure code"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - jk_log(l, JK_LOG_INFO, "Can't shutdown servlet engine - code %08lx", - status); - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -/* - * Build the Unknown Packet - * - * +-----------------------------+---------------------------------+------------------------------+ - * | UNKNOWN PACKET CMD (1 byte) | UNHANDLED MESSAGE SIZE (16bits) | UNHANDLED MESSAGE (bytes...) | - * +-----------------------------+---------------------------------+------------------------------+ - * - */ - -int ajp14_marshal_unknown_packet_into_msgb(jk_msg_buf_t *msg, - jk_msg_buf_t *unk, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - - /* To be on the safe side */ - jk_b_reset(msg); - - /* - * UNKNOWN PACKET CMD - */ - if (jk_b_append_byte(msg, AJP14_UNKNOW_PACKET_CMD)) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - /* - * UNHANDLED MESSAGE SIZE - */ - if (jk_b_append_int(msg, (unsigned short)unk->len)) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - /* - * UNHANDLED MESSAGE (Question : Did we have to send all the message or only part of) - * ( ie: only 1k max ) - */ - if (jk_b_append_bytes(msg, unk->buf, unk->len)) { - jk_log(l, JK_LOG_ERROR, - "failed appending the UNHANDLED MESSAGE"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -/* - * Build the Context Query Cmd (autoconf) - * - * +--------------------------+---------------------------------+ - * | CONTEXT QRY CMD (1 byte) | VIRTUAL HOST NAME (CString (*)) | - * +--------------------------+---------------------------------+ - * - */ - -int ajp14_marshal_context_query_into_msgb(jk_msg_buf_t *msg, - char *virtual, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - - /* To be on the safe side */ - jk_b_reset(msg); - - /* - * CONTEXT QUERY CMD - */ - if (jk_b_append_byte(msg, AJP14_CONTEXT_QRY_CMD)) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - /* - * VIRTUAL HOST CSTRING - */ - if (jk_b_append_string(msg, virtual)) { - jk_log(l, JK_LOG_ERROR, - "failed appending the virtual host string"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - - -/* - * Decode the Context Info Cmd (Autoconf) - * - * The Autoconf feature of AJP14, let us know which URL/URI could - * be handled by the servlet-engine - * - * +---------------------------+---------------------------------+----------------------------+-------------------------------+-----------+ - * | CONTEXT INFO CMD (1 byte) | VIRTUAL HOST NAME (CString (*)) | CONTEXT NAME (CString (*)) | URL1 [\n] URL2 [\n] URL3 [\n] | NEXT CTX. | - * +---------------------------+---------------------------------+----------------------------+-------------------------------+-----------+ - */ - -int ajp14_unmarshal_context_info(jk_msg_buf_t *msg, - jk_context_t *c, jk_logger_t *l) -{ - char *vname; - char *cname; - char *uri; - - vname = (char *)jk_b_get_string(msg); - - JK_TRACE_ENTER(l); - jk_log(l, JK_LOG_DEBUG, - "get virtual %s for virtual %s", - vname, c->virt); - - if (!vname) { - jk_log(l, JK_LOG_ERROR, - "can't get virtual hostname"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - /* Check if we get the correct virtual host */ - if (c->virt != NULL && vname != NULL && strcmp(c->virt, vname)) { - /* set the virtual name, better to add to a virtual list ? */ - - if (context_set_virtual(c, vname) == JK_FALSE) { - jk_log(l, JK_LOG_ERROR, - "can't malloc virtual hostname"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - - for (;;) { - - cname = (char *)jk_b_get_string(msg); - - if (!cname) { - jk_log(l, JK_LOG_ERROR, - "can't get context"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - jk_log(l, JK_LOG_DEBUG, - "get context %s for virtual %s", - cname, vname); - - /* grab all contexts up to empty one which indicate end of contexts */ - if (!strlen(cname)) - break; - - /* create new context base (if needed) */ - - if (context_add_base(c, cname) == JK_FALSE) { - jk_log(l, JK_LOG_ERROR, - "can't add/set context %s", - cname); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - for (;;) { - - uri = (char *)jk_b_get_string(msg); - - if (!uri) { - jk_log(l, JK_LOG_ERROR, - "can't get URI"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (!strlen(uri)) { - jk_log(l, JK_LOG_DEBUG, "No more URI for context %s", cname); - break; - } - - jk_log(l, JK_LOG_INFO, - "Got URI (%s) for virtualhost %s and context %s", uri, - vname, cname); - - if (context_add_uri(c, cname, uri) == JK_FALSE) { - jk_log(l, JK_LOG_ERROR, - "can't add/set uri (%s) for context %s", - uri, cname); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - } - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - - -/* - * Build the Context State Query Cmd - * - * We send the list of contexts where we want to know state, empty string end context list* - * If cname is set, only ask about THIS context - * - * +----------------------------+----------------------------------+----------------------------+----+ - * | CONTEXT STATE CMD (1 byte) | VIRTUAL HOST NAME (CString (*)) | CONTEXT NAME (CString (*)) | .. | - * +----------------------------+----------------------------------+----------------------------+----+ - * - */ - -int ajp14_marshal_context_state_into_msgb(jk_msg_buf_t *msg, - jk_context_t *c, - char *cname, jk_logger_t *l) -{ - jk_context_item_t *ci; - int i; - - JK_TRACE_ENTER(l); - - /* To be on the safe side */ - jk_b_reset(msg); - - /* - * CONTEXT STATE CMD - */ - if (jk_b_append_byte(msg, AJP14_CONTEXT_STATE_CMD)) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - /* - * VIRTUAL HOST CSTRING - */ - if (jk_b_append_string(msg, c->virt)) { - jk_log(l, JK_LOG_ERROR, - "failed appending the virtual host string"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (cname) { - - ci = context_find_base(c, cname); - - if (!ci) { - jk_log(l, JK_LOG_ERROR, - "unknown context %s", - cname); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - /* - * CONTEXT CSTRING - */ - - if (jk_b_append_string(msg, cname)) { - jk_log(l, JK_LOG_ERROR, - "failed appending the context string %s", - cname); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - else { /* Grab all contexts name */ - - for (i = 0; i < c->size; i++) { - - /* - * CONTEXT CSTRING - */ - if (jk_b_append_string(msg, c->contexts[i]->cbase)) { - jk_log(l, JK_LOG_ERROR, - "failed appending the context string %s", - c->contexts[i]->cbase); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - } - - /* End of context list, an empty string */ - - if (jk_b_append_string(msg, "")) { - jk_log(l, JK_LOG_ERROR, - "failed appending end of contexts"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - - -/* - * Decode the Context State Reply Cmd - * - * We get update of contexts list, empty string end context list* - * - * +----------------------------------+---------------------------------+----------------------------+------------------+----+ - * | CONTEXT STATE REPLY CMD (1 byte) | VIRTUAL HOST NAME (CString (*)) | CONTEXT NAME (CString (*)) | UP/DOWN (1 byte) | .. | - * +----------------------------------+---------------------------------+----------------------------+------------------+----+ - * - */ - -int ajp14_unmarshal_context_state_reply(jk_msg_buf_t *msg, - jk_context_t *c, jk_logger_t *l) -{ - char *vname; - char *cname; - jk_context_item_t *ci; - - JK_TRACE_ENTER(l); - /* get virtual name */ - vname = (char *)jk_b_get_string(msg); - - if (!vname) { - jk_log(l, JK_LOG_ERROR, - "can't get virtual hostname"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - /* Check if we speak about the correct virtual */ - if (strcmp(c->virt, vname)) { - jk_log(l, JK_LOG_ERROR, - "incorrect virtual %s instead of %s", - vname, c->virt); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - for (;;) { - - /* get context name */ - cname = (char *)jk_b_get_string(msg); - - if (!cname) { - jk_log(l, JK_LOG_ERROR, - "can't get context"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (!strlen(cname)) - break; - - ci = context_find_base(c, cname); - - if (!ci) { - jk_log(l, JK_LOG_ERROR, - "unknow context %s for virtual %s", - cname, vname); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - ci->status = jk_b_get_int(msg); - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "updated context %s to state %d", - cname, ci->status); - } - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -/* - * Decode the Context Update Cmd - * - * +-----------------------------+---------------------------------+----------------------------+------------------+ - * | CONTEXT UPDATE CMD (1 byte) | VIRTUAL HOST NAME (CString (*)) | CONTEXT NAME (CString (*)) | UP/DOWN (1 byte) | - * +-----------------------------+---------------------------------+----------------------------+------------------+ - * - */ - -int ajp14_unmarshal_context_update_cmd(jk_msg_buf_t *msg, - jk_context_t *c, jk_logger_t *l) -{ - int rc; - JK_TRACE_ENTER(l); - rc = ajp14_unmarshal_context_state_reply(msg, c, l); - JK_TRACE_EXIT(l); - return rc; -} diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.h deleted file mode 100644 index 58a5a4de..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.h +++ /dev/null @@ -1,307 +0,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. - */ - -/*************************************************************************** - * Description: Next generation bi-directional protocol handler. * - * Author: Henri Gomez * - * Version: $Revision: 466585 $ * - ***************************************************************************/ -#ifndef JK_AJP14_H -#define JK_AJP14_H - -#include "jk_ajp_common.h" -#include "jk_context.h" - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -#define AJP14_PROTO 14 - -#define AJP14_WS_HEADER 0x1235 -#define AJP14_SW_HEADER 0x1235 /* AJP14 use now the same header in both directions */ - -#define AJP14_DEF_HOST ("localhost") -#define AJP14_DEF_PORT (8011) -#define AJP14_READ_BUF_SIZE (8*1024) -#define AJP14_DEF_RETRY_ATTEMPTS (1) -#define AJP14_DEF_CACHE_SZ (1) -#define AJP14_MAX_SEND_BODY_SZ (DEF_BUFFER_SZ - 6) -#define AJP14_HEADER_LEN (4) -#define AJP14_HEADER_SZ_LEN (2) - -/* - * Initial Login Phase (web server -> servlet engine) - */ -#define AJP14_LOGINIT_CMD (unsigned char)0x10 - -/* - * Second Login Phase (servlet engine -> web server), md5 seed is received - */ -#define AJP14_LOGSEED_CMD (unsigned char)0x11 - -/* - * Third Login Phase (web server -> servlet engine), md5 of seed + secret is sent - */ -#define AJP14_LOGCOMP_CMD (unsigned char)0x12 - -/* - * Login Accepted (servlet engine -> web server) - */ -#define AJP14_LOGOK_CMD (unsigned char)0x13 - -/* - * Login Rejected (servlet engine -> web server), will be logged - */ -#define AJP14_LOGNOK_CMD (unsigned char)0x14 - -/* - * Context Query (web server -> servlet engine), which URI are handled by servlet engine ? - */ -#define AJP14_CONTEXT_QRY_CMD (unsigned char)0x15 - -/* - * Context Info (servlet engine -> web server), URI handled response - */ -#define AJP14_CONTEXT_INFO_CMD (unsigned char)0x16 - -/* - * Context Update (servlet engine -> web server), status of context changed - */ -#define AJP14_CONTEXT_UPDATE_CMD (unsigned char)0x17 - -/* - * Servlet Engine Status (web server -> servlet engine), what's the status of the servlet engine ? - */ -#define AJP14_STATUS_CMD (unsigned char)0x18 - -/* - * Secure Shutdown command (web server -> servlet engine), please servlet stop yourself. - */ -#define AJP14_SHUTDOWN_CMD (unsigned char)0x19 - -/* - * Secure Shutdown command Accepted (servlet engine -> web server) - */ -#define AJP14_SHUTOK_CMD (unsigned char)0x1A - -/* - * Secure Shutdown Rejected (servlet engine -> web server) - */ -#define AJP14_SHUTNOK_CMD (unsigned char)0x1B - -/* - * Context Status (web server -> servlet engine), what's the status of the context ? - */ -#define AJP14_CONTEXT_STATE_CMD (unsigned char)0x1C - -/* - * Context Status Reply (servlet engine -> web server), status of context - */ -#define AJP14_CONTEXT_STATE_REP_CMD (unsigned char)0x1D - -/* - * Unknown Packet Reply (web server <-> servlet engine), when a packet couldn't be decoded - */ -#define AJP14_UNKNOW_PACKET_CMD (unsigned char)0x1E - - -/* - * Negociation flags - */ - -/* - * web-server want context info after login - */ -#define AJP14_CONTEXT_INFO_NEG 0x80000000 - -/* - * web-server want context updates - */ -#define AJP14_CONTEXT_UPDATE_NEG 0x40000000 - -/* - * web-server want compressed stream - */ -#define AJP14_GZIP_STREAM_NEG 0x20000000 - -/* - * web-server want crypted DES56 stream with secret key - */ -#define AJP14_DES56_STREAM_NEG 0x10000000 - -/* - * Extended info on server SSL vars - */ -#define AJP14_SSL_VSERVER_NEG 0x08000000 - -/* - *Extended info on client SSL vars - */ -#define AJP14_SSL_VCLIENT_NEG 0x04000000 - -/* - * Extended info on crypto SSL vars - */ -#define AJP14_SSL_VCRYPTO_NEG 0x02000000 - -/* - * Extended info on misc SSL vars - */ -#define AJP14_SSL_VMISC_NEG 0x01000000 - -/* - * mask of protocol supported - */ -#define AJP14_PROTO_SUPPORT_AJPXX_NEG 0x00FF0000 - -/* - * communication could use AJP14 - */ -#define AJP14_PROTO_SUPPORT_AJP14_NEG 0x00010000 - -/* - * communication could use AJP15 - */ -#define AJP14_PROTO_SUPPORT_AJP15_NEG 0x00020000 - -/* - * communication could use AJP16 - */ -#define AJP14_PROTO_SUPPORT_AJP16_NEG 0x00040000 - -/* - * Some failure codes - */ -#define AJP14_BAD_KEY_ERR 0xFFFFFFFF -#define AJP14_ENGINE_DOWN_ERR 0xFFFFFFFE -#define AJP14_RETRY_LATER_ERR 0xFFFFFFFD -#define AJP14_SHUT_AUTHOR_FAILED_ERR 0xFFFFFFFC - -/* - * Some status codes - */ -#define AJP14_CONTEXT_DOWN 0x01 -#define AJP14_CONTEXT_UP 0x02 -#define AJP14_CONTEXT_OK 0x03 - -/* - * Misc defines - */ -#define AJP14_ENTROPY_SEED_LEN 32 /* we're using MD5 => 32 chars */ -#define AJP14_COMPUTED_KEY_LEN 32 /* we're using MD5 also */ - -/* - * The login structure - */ -typedef struct jk_login_service jk_login_service_t; - -struct jk_login_service -{ - - /* - * Pointer to web-server name - */ - const char *web_server_name; - - /* - * Pointer to servlet-engine name - */ - char *servlet_engine_name; - - /* - * Pointer to secret key - */ - const char *secret_key; - - /* - * Received entropy seed - */ - char entropy[AJP14_ENTROPY_SEED_LEN + 1]; - - /* - * Computed key - */ - char computed_key[AJP14_COMPUTED_KEY_LEN + 1]; - - /* - * What we want to negociate - */ - unsigned long negociation; - - /* - * What we received from servlet engine - */ - unsigned long negociated; -}; - -/* - * functions defined here - */ - -void ajp14_compute_md5(jk_login_service_t *s, jk_logger_t *l); - -int ajp14_marshal_login_init_into_msgb(jk_msg_buf_t *msg, - jk_login_service_t *s, - jk_logger_t *l); - -int ajp14_unmarshal_login_seed(jk_msg_buf_t *msg, - jk_login_service_t *s, jk_logger_t *l); - -int ajp14_marshal_login_comp_into_msgb(jk_msg_buf_t *msg, - jk_login_service_t *s, - jk_logger_t *l); - -int ajp14_unmarshal_log_ok(jk_msg_buf_t *msg, - jk_login_service_t *s, jk_logger_t *l); - -int ajp14_unmarshal_log_nok(jk_msg_buf_t *msg, jk_logger_t *l); - -int ajp14_marshal_shutdown_into_msgb(jk_msg_buf_t *msg, - jk_login_service_t *s, - jk_logger_t *l); - -int ajp14_unmarshal_shutdown_nok(jk_msg_buf_t *msg, jk_logger_t *l); - -int ajp14_marshal_unknown_packet_into_msgb(jk_msg_buf_t *msg, - jk_msg_buf_t *unk, - jk_logger_t *l); - -int ajp14_marshal_context_query_into_msgb(jk_msg_buf_t *msg, - char *virtual, jk_logger_t *l); - -int ajp14_unmarshal_context_info(jk_msg_buf_t *msg, - jk_context_t *context, jk_logger_t *l); - -int ajp14_marshal_context_state_into_msgb(jk_msg_buf_t *msg, - jk_context_t *context, - char *cname, jk_logger_t *l); - -int ajp14_unmarshal_context_state_reply(jk_msg_buf_t *msg, - jk_context_t *context, - jk_logger_t *l); - -int ajp14_unmarshal_context_update_cmd(jk_msg_buf_t *msg, - jk_context_t *context, - jk_logger_t *l); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* JK_AJP14_H */ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.lo deleted file mode 100644 index 3613a169..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.lo +++ /dev/null @@ -1,12 +0,0 @@ -# jk_ajp14.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/jk_ajp14.o' - -# Name of the non-PIC object. -non_pic_object='jk_ajp14.o' - diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.o deleted file mode 100644 index f3f783c5..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.c deleted file mode 100644 index 639fb11c..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.c +++ /dev/null @@ -1,404 +0,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. - */ - -/*************************************************************************** - * Description: AJP14 next generation Bi-directional protocol. * - * Author: Henri Gomez * - * Version: $Revision: 611589 $ * - ***************************************************************************/ - -#include "jk_context.h" -#include "jk_ajp14_worker.h" - - -/* - * AJP14 Autoconf Phase - * - * CONTEXT QUERY / REPLY - */ - -#define MAX_URI_SIZE 512 - -static int handle_discovery(ajp_endpoint_t * ae, - jk_worker_env_t *we, - jk_msg_buf_t *msg, jk_logger_t *l) -{ - int cmd; - int i, j; -#if 0 - /* Not used for now */ - jk_login_service_t *jl = ae->worker->login; -#endif - jk_context_item_t *ci; - jk_context_t *c; - char *buf; - -#ifndef TESTME - JK_TRACE_ENTER(l); - - ajp14_marshal_context_query_into_msgb(msg, we->virtual, l); - - jk_log(l, JK_LOG_DEBUG, "send query"); - - if (ajp_connection_tcp_send_message(ae, msg, l) != JK_TRUE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - jk_log(l, JK_LOG_DEBUG, "wait context reply"); - - jk_b_reset(msg); - - if (ajp_connection_tcp_get_message(ae, msg, l) != JK_TRUE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - if ((cmd = jk_b_get_byte(msg)) != AJP14_CONTEXT_INFO_CMD) { - jk_log(l, JK_LOG_ERROR, - "awaited command %d, received %d", - AJP14_CONTEXT_INFO_CMD, cmd); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (context_alloc(&c, we->virtual) != JK_TRUE) { - jk_log(l, JK_LOG_ERROR, - "can't allocate context room"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (ajp14_unmarshal_context_info(msg, c, l) != JK_TRUE) { - jk_log(l, JK_LOG_ERROR, - "can't get context reply"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - jk_log(l, JK_LOG_DEBUG, "received context"); - - buf = malloc(MAX_URI_SIZE); /* Really a very long URI */ - - if (!buf) { - jk_log(l, JK_LOG_ERROR, "can't malloc buf"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - for (i = 0; i < c->size; i++) { - ci = c->contexts[i]; - for (j = 0; j < ci->size; j++) { - -#ifndef USE_SPRINTF - snprintf(buf, MAX_URI_SIZE - 1, "/%s/%s", ci->cbase, ci->uris[j]); -#else - sprintf(buf, "/%s/%s", ci->cbase, ci->uris[j]); -#endif - - jk_log(l, JK_LOG_INFO, - "worker %s will handle uri %s in context %s [%s]", - ae->worker->name, ci->uris[j], ci->cbase, buf); - - uri_worker_map_add(we->uri_to_worker, buf, ae->worker->name, SOURCE_TYPE_DISCOVER, l); - } - } - - free(buf); - context_free(&c); - -#else - - uri_worker_map_add(we->uri_to_worker, "/examples/servlet/*", - ae->worker->name, SOURCE_TYPE_DISCOVER, l); - uri_worker_map_add(we->uri_to_worker, "/examples/*.jsp", ae->worker->name, - SOURCE_TYPE_DISCOVER, l); - uri_worker_map_add(we->uri_to_worker, "/examples/*.gif", ae->worker->name, - SOURCE_TYPE_DISCOVER, l); - -#endif - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -/* - * AJP14 Logon Phase - * - * INIT + REPLY / NEGO + REPLY - */ - -static int handle_logon(ajp_endpoint_t * ae, - jk_msg_buf_t *msg, jk_logger_t *l) -{ - int cmd; - - jk_login_service_t *jl = ae->worker->login; - JK_TRACE_ENTER(l); - - ajp14_marshal_login_init_into_msgb(msg, jl, l); - - jk_log(l, JK_LOG_DEBUG, "send init"); - - if (ajp_connection_tcp_send_message(ae, msg, l) != JK_TRUE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - jk_log(l, JK_LOG_DEBUG, "wait init reply"); - - jk_b_reset(msg); - - if (ajp_connection_tcp_get_message(ae, msg, l) != JK_TRUE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - if ((cmd = jk_b_get_byte(msg)) != AJP14_LOGSEED_CMD) { - jk_log(l, JK_LOG_ERROR, - "awaited command %d, received %d", - AJP14_LOGSEED_CMD, cmd); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (ajp14_unmarshal_login_seed(msg, jl, l) != JK_TRUE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - jk_log(l, JK_LOG_DEBUG, "received entropy %s", - jl->entropy); - - ajp14_compute_md5(jl, l); - - if (ajp14_marshal_login_comp_into_msgb(msg, jl, l) != JK_TRUE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - if (ajp_connection_tcp_send_message(ae, msg, l) != JK_TRUE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - jk_b_reset(msg); - - if (ajp_connection_tcp_get_message(ae, msg, l) != JK_TRUE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - switch (jk_b_get_byte(msg)) { - - case AJP14_LOGOK_CMD: - if (ajp14_unmarshal_log_ok(msg, jl, l) == JK_TRUE) { - jk_log(l, JK_LOG_DEBUG, - "Successfully connected to servlet-engine %s", - jl->servlet_engine_name); - JK_TRACE_EXIT(l); - return JK_TRUE; - } - break; - - case AJP14_LOGNOK_CMD: - ajp14_unmarshal_log_nok(msg, l); - break; - } - - JK_TRACE_EXIT(l); - return JK_FALSE; -} - -static int logon(ajp_endpoint_t * ae, jk_logger_t *l) -{ - jk_pool_t *p = &ae->pool; - jk_msg_buf_t *msg; - int rc; - - JK_TRACE_ENTER(l); - - msg = jk_b_new(p); - jk_b_set_buffer_size(msg, DEF_BUFFER_SZ); - - if ((rc = handle_logon(ae, msg, l)) == JK_FALSE) - ajp_close_endpoint(ae, l); - - JK_TRACE_EXIT(l); - return rc; -} - -static int discovery(ajp_endpoint_t * ae, jk_worker_env_t *we, jk_logger_t *l) -{ - jk_pool_t *p = &ae->pool; - jk_msg_buf_t *msg; - int rc; - - JK_TRACE_ENTER(l); - - msg = jk_b_new(p); - jk_b_set_buffer_size(msg, DEF_BUFFER_SZ); - - if ((rc = handle_discovery(ae, we, msg, l)) == JK_FALSE) - ajp_close_endpoint(ae, l); - - JK_TRACE_EXIT(l); - return rc; -} - -/* -------------------- Method -------------------- */ -static int JK_METHOD validate(jk_worker_t *pThis, - jk_map_t *props, - jk_worker_env_t *we, jk_logger_t *l) -{ - ajp_worker_t *aw; - const char *secret_key; - - JK_TRACE_ENTER(l); - if (ajp_validate(pThis, props, we, l, AJP14_PROTO) == JK_FALSE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - aw = pThis->worker_private; - - secret_key = jk_get_worker_secret_key(props, aw->name); - - if ((!secret_key) || (!strlen(secret_key))) { - jk_log(l, JK_LOG_ERROR, - "validate error, empty or missing secretkey"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - /* jk_log(l, JK_LOG_DEBUG, "Into ajp14:validate - secret_key=%s", secret_key); */ - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -static int JK_METHOD get_endpoint(jk_worker_t *pThis, - jk_endpoint_t **pend, jk_logger_t *l) -{ - int rc; - JK_TRACE_ENTER(l); - rc = ajp_get_endpoint(pThis, pend, l, AJP14_PROTO); - JK_TRACE_EXIT(l); - return rc; -} - -static int JK_METHOD init(jk_worker_t *pThis, - jk_map_t *props, - jk_worker_env_t *we, jk_logger_t *l) -{ - ajp_worker_t *aw; - ajp_endpoint_t *ae; - jk_endpoint_t *je; - int rc; - - JK_TRACE_EXIT(l); - - if (ajp_init(pThis, props, we, l, AJP14_PROTO) == JK_FALSE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - aw = pThis->worker_private; - - /* Set Secret Key (used at logon time) */ - aw->login->secret_key = jk_get_worker_secret_key(props, aw->name); - - if (aw->login->secret_key == NULL) { - jk_log(l, JK_LOG_ERROR, "can't malloc secret_key"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - /* Set WebServerName (used at logon time) */ - aw->login->web_server_name = strdup(we->server_name); - - if (aw->login->web_server_name == NULL) { - jk_log(l, JK_LOG_ERROR, "can't malloc web_server_name"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (get_endpoint(pThis, &je, l) == JK_FALSE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - ae = je->endpoint_private; - - if (ajp_connect_to_endpoint(ae, l) == JK_TRUE) { - - /* connection stage passed - try to get context info - * this is the long awaited autoconf feature :) - */ - rc = discovery(ae, we, l); - ajp_close_endpoint(ae, l); - JK_TRACE_EXIT(l); - return rc; - } - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - - -static int JK_METHOD destroy(jk_worker_t **pThis, jk_logger_t *l) -{ - int rc; - ajp_worker_t *aw = (*pThis)->worker_private; - - JK_TRACE_ENTER(l); - - if (aw->login) { - free(aw->login); - aw->login = NULL; - } - - rc = ajp_destroy(pThis, l, AJP14_PROTO); - JK_TRACE_EXIT(l); - return rc; -} - -int JK_METHOD ajp14_worker_factory(jk_worker_t **w, - const char *name, jk_logger_t *l) -{ - ajp_worker_t *aw; - - JK_TRACE_ENTER(l); - if (ajp_worker_factory(w, name, l) == JK_FALSE) - return 0; - - aw = (*w)->worker_private; - aw->proto = AJP14_PROTO; - - aw->login = (jk_login_service_t *)malloc(sizeof(jk_login_service_t)); - - if (aw->login == NULL) { - jk_log(l, JK_LOG_ERROR, - "malloc failed for login area"); - JK_TRACE_EXIT(l); - return 0; - } - - memset(aw->login, 0, sizeof(jk_login_service_t)); - - aw->login->negociation = - (AJP14_CONTEXT_INFO_NEG | AJP14_PROTO_SUPPORT_AJP14_NEG); - aw->login->web_server_name = NULL; /* must be set in init */ - - aw->worker.validate = validate; - aw->worker.init = init; - aw->worker.get_endpoint = get_endpoint; - aw->worker.destroy = destroy; - - aw->logon = logon; /* LogOn Handler for AJP14 */ - - JK_TRACE_EXIT(l); - return JK_AJP14_WORKER_TYPE; -} diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.h deleted file mode 100644 index 3d5c7973..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.h +++ /dev/null @@ -1,52 +0,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. - */ - -/*************************************************************************** - * Description: ajpv14 worker header file * - * Author: Henri Gomez * - * Version: $Revision: 466585 $ * - ***************************************************************************/ - -#ifndef JK_AJP14_WORKER_H -#define JK_AJP14_WORKER_H - -#include "jk_pool.h" -#include "jk_connect.h" -#include "jk_util.h" -#include "jk_msg_buff.h" -#include "jk_ajp13.h" -#include "jk_ajp14.h" -#include "jk_logger.h" -#include "jk_service.h" -#include "jk_ajp13_worker.h" - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -#define JK_AJP14_WORKER_NAME ("ajp14") -#define JK_AJP14_WORKER_TYPE (3) - -int JK_METHOD ajp14_worker_factory(jk_worker_t **w, - const char *name, jk_logger_t *l); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* JK_AJP14_WORKER_H */ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.lo deleted file mode 100644 index cfd049e1..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.lo +++ /dev/null @@ -1,12 +0,0 @@ -# jk_ajp14_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/jk_ajp14_worker.o' - -# Name of the non-PIC object. -non_pic_object='jk_ajp14_worker.o' - diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.o deleted file mode 100644 index 604ad3b1..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.c deleted file mode 100644 index 7b083264..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.c +++ /dev/null @@ -1,3383 +0,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. - */ - -/*************************************************************************** - * Description: common stuff for bi-directional protocols ajp13/ajp14. * - * Author: Gal Shachor * - * Author: Henri Gomez * - * Version: $Revision: 1137200 $ * - ***************************************************************************/ - - -#include "jk_global.h" -#include "jk_util.h" -#include "jk_ajp13.h" -#include "jk_ajp14.h" -#include "jk_ajp_common.h" -#include "jk_connect.h" -#if defined(AS400) && !defined(AS400_UTF8) -#include "util_ebcdic.h" -#endif -#if defined(NETWARE) && defined(__NOVELL_LIBC__) -#include "novsock2.h" -#endif - -const char *response_trans_headers[] = { - "Content-Type", - "Content-Language", - "Content-Length", - "Date", - "Last-Modified", - "Location", - "Set-Cookie", - "Set-Cookie2", - "Servlet-Engine", - "Status", - "WWW-Authenticate" -}; - -static const char *long_res_header_for_sc(int sc) -{ - const char *rc = NULL; - sc = sc & 0X00FF; - if (sc <= SC_RES_HEADERS_NUM && sc > 0) { - rc = response_trans_headers[sc - 1]; - } - - return rc; -} - -static const char *ajp_state_type[] = { - JK_AJP_STATE_TEXT_IDLE, - JK_AJP_STATE_TEXT_OK, - JK_AJP_STATE_TEXT_ERROR, - JK_AJP_STATE_TEXT_PROBE, - "unknown", - NULL -}; - -#define UNKNOWN_METHOD (-1) - -static int sc_for_req_method(const char *method, 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 'A': - return (method[1] == 'C' - && method[2] == 'L' - ? SC_M_ACL : UNKNOWN_METHOD); - case 'P': - return (method[1] == 'U' - && method[2] == 'T' - ? SC_M_PUT : UNKNOWN_METHOD); - case 'G': - return (method[1] == 'E' - && method[2] == 'T' - ? SC_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' - ? SC_M_HEAD : UNKNOWN_METHOD); - case 'P': - return (method[1] == 'O' - && method[2] == 'S' - && method[3] == 'T' - ? SC_M_POST : UNKNOWN_METHOD); - case 'M': - return (method[1] == 'O' - && method[2] == 'V' - && method[3] == 'E' - ? SC_M_MOVE : UNKNOWN_METHOD); - case 'L': - return (method[1] == 'O' - && method[2] == 'C' - && method[3] == 'K' - ? SC_M_LOCK : UNKNOWN_METHOD); - case 'C': - return (method[1] == 'O' - && method[2] == 'P' - && method[3] == 'Y' - ? SC_M_COPY : UNKNOWN_METHOD); - default: - return UNKNOWN_METHOD; - } - - case 5: - switch (method[2]) - { - case 'R': - return (memcmp(method, "MERGE", 5) == 0 - ? SC_M_MERGE : UNKNOWN_METHOD); - case 'C': - return (memcmp(method, "MKCOL", 5) == 0 - ? SC_M_MKCOL : UNKNOWN_METHOD); - case 'B': - return (memcmp(method, "LABEL", 5) == 0 - ? SC_M_LABEL : UNKNOWN_METHOD); - case 'A': - return (memcmp(method, "TRACE", 5) == 0 - ? SC_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 - ? SC_M_UNLOCK : UNKNOWN_METHOD); - case 'E': - return (memcmp(method, "UPDATE", 6) == 0 - ? SC_M_UPDATE : UNKNOWN_METHOD); - default: - return UNKNOWN_METHOD; - } - case 'R': - return (memcmp(method, "REPORT", 6) == 0 - ? SC_M_REPORT : UNKNOWN_METHOD); - case 'S': - return (memcmp(method, "SEARCH", 6) == 0 - ? SC_M_SEARCH : UNKNOWN_METHOD); - case 'D': - return (memcmp(method, "DELETE", 6) == 0 - ? SC_M_DELETE : UNKNOWN_METHOD); - default: - return UNKNOWN_METHOD; - } - - case 7: - switch (method[1]) - { - case 'P': - return (memcmp(method, "OPTIONS", 7) == 0 - ? SC_M_OPTIONS : UNKNOWN_METHOD); - case 'H': - return (memcmp(method, "CHECKIN", 7) == 0 - ? SC_M_CHECKIN : UNKNOWN_METHOD); - default: - return UNKNOWN_METHOD; - } - - case 8: - switch (method[0]) - { - case 'P': - return (memcmp(method, "PROPFIND", 8) == 0 - ? SC_M_PROPFIND : UNKNOWN_METHOD); - case 'C': - return (memcmp(method, "CHECKOUT", 8) == 0 - ? SC_M_CHECKOUT : UNKNOWN_METHOD); - default: - return UNKNOWN_METHOD; - } - - case 9: - return (memcmp(method, "PROPPATCH", 9) == 0 - ? SC_M_PROPPATCH : UNKNOWN_METHOD); - - case 10: - switch (method[0]) - { - case 'U': - return (memcmp(method, "UNCHECKOUT", 10) == 0 - ? SC_M_UNCHECKOUT : UNKNOWN_METHOD); - case 'M': - return (memcmp(method, "MKACTIVITY", 10) == 0 - ? SC_M_MKACTIVITY : UNKNOWN_METHOD); - default: - return UNKNOWN_METHOD; - } - - case 11: - return (memcmp(method, "MKWORKSPACE", 11) == 0 - ? SC_M_MKWORKSPACE : UNKNOWN_METHOD); - - case 15: - return (memcmp(method, "VERSION-CONTROL", 15) == 0 - ? SC_M_VERSION_CONTROL : UNKNOWN_METHOD); - - case 16: - return (memcmp(method, "BASELINE-CONTROL", 16) == 0 - ? SC_M_BASELINE_CONTROL : UNKNOWN_METHOD); - - default: - return UNKNOWN_METHOD; - } - - /* NOTREACHED */ -} - -static int sc_for_req_header(const char *header_name) -{ - char header[16]; - size_t len = strlen(header_name); - const char *p = header_name; - int i = 0; - - /* ACCEPT-LANGUAGE is the longest header - * that is of interest. - */ - if (len < 4 || len > 15) - return UNKNOWN_METHOD; - - while (*p) { - header[i++] = toupper((unsigned char)*p); - p++; - } - - header[i] = '\0'; - p = &header[1]; - -/* Always do memcmp including the final \0-termination character. - */ - switch (header[0]) { - case 'A': - if (memcmp(p, "CCEPT", 6) == 0) { - if (!header[6]) - return SC_ACCEPT; - else if (header[6] == '-') { - p += 6; - if (memcmp(p, "CHARSET", 8) == 0) - return SC_ACCEPT_CHARSET; - else if (memcmp(p, "ENCODING", 9) == 0) - return SC_ACCEPT_ENCODING; - else if (memcmp(p, "LANGUAGE", 9) == 0) - return SC_ACCEPT_LANGUAGE; - else - return UNKNOWN_METHOD; - } - else - return UNKNOWN_METHOD; - } - else if (memcmp(p, "UTHORIZATION", 13) == 0) - return SC_AUTHORIZATION; - else - return UNKNOWN_METHOD; - break; - case 'C': - if(memcmp(p, "OOKIE2", 7) == 0) - return SC_COOKIE2; - else if (memcmp(p, "OOKIE", 6) == 0) - return SC_COOKIE; - else if(memcmp(p, "ONNECTION", 10) == 0) - return SC_CONNECTION; - else if(memcmp(p, "ONTENT-TYPE", 12) == 0) - return SC_CONTENT_TYPE; - else if(memcmp(p, "ONTENT-LENGTH", 14) == 0) - return SC_CONTENT_LENGTH; - else - return UNKNOWN_METHOD; - break; - case 'H': - if(memcmp(p, "OST", 4) == 0) - return SC_HOST; - else - return UNKNOWN_METHOD; - break; - case 'P': - if(memcmp(p, "RAGMA", 6) == 0) - return SC_PRAGMA; - else - return UNKNOWN_METHOD; - break; - case 'R': - if(memcmp(p, "EFERER", 7) == 0) - return SC_REFERER; - else - return UNKNOWN_METHOD; - break; - case 'U': - if(memcmp(p, "SER-AGENT", 10) == 0) - return SC_USER_AGENT; - else - return UNKNOWN_METHOD; - break; - default: - return UNKNOWN_METHOD; - } - /* NOTREACHED */ -} - -/* Return the string representation of the worker state */ -const char *jk_ajp_get_state(ajp_worker_t *aw, jk_logger_t *l) -{ - return ajp_state_type[aw->s->state]; -} - -/* Return the int representation of the worker state */ -int jk_ajp_get_state_code(const char *v) -{ - if (!v) - return JK_AJP_STATE_DEF; - else if (*v == 'i' || *v == 'I' || *v == 'n' || *v == 'N' || *v == '0') - return JK_AJP_STATE_IDLE; - else if (*v == 'o' || *v == 'O' || *v == '1') - return JK_AJP_STATE_OK; - else if (*v == 'e' || *v == 'E' || *v == '4') - return JK_AJP_STATE_ERROR; - else if (*v == 'p' || *v == 'P' || *v == '6') - return JK_AJP_STATE_PROBE; - else - return JK_AJP_STATE_DEF; -} - -int jk_ajp_get_cping_mode(const char *m, int def) -{ - int mv = def; - if (!m) - return mv; - while (*m != '\0') { - if (*m == 'C' || *m == 'c') - mv |= AJP_CPING_CONNECT; - else if (*m == 'P' || *m == 'p') - mv |= AJP_CPING_PREPOST; - else if (*m == 'I' || *m == 'i') - mv |= AJP_CPING_INTERVAL; - else if (*m == 'A' || *m == 'a') { - mv = AJP_CPING_CONNECT | AJP_CPING_PREPOST | AJP_CPING_INTERVAL; - break; - } - m++; - } - return mv; -} - -/* - * Message structure - * - * -AJPV13_REQUEST/AJPV14_REQUEST= - request_prefix (1) (byte) - method (byte) - protocol (string) - req_uri (string) - remote_addr (string) - remote_host (string) - server_name (string) - server_port (short) - is_ssl (boolean) - num_headers (short) - num_headers*(req_header_name header_value) - - ?context (byte)(string) - ?servlet_path (byte)(string) - ?remote_user (byte)(string) - ?auth_type (byte)(string) - ?query_string (byte)(string) - ?route (byte)(string) - ?ssl_cert (byte)(string) - ?ssl_cipher (byte)(string) - ?ssl_session (byte)(string) - ?ssl_key_size (byte)(int) via JkOptions +ForwardKeySize - request_terminator (byte) - ?body content_length*(var binary) - - */ - -static int ajp_marshal_into_msgb(jk_msg_buf_t *msg, - jk_ws_service_t *s, - jk_logger_t *l, ajp_endpoint_t * ae) -{ - int method; - unsigned int i; - - JK_TRACE_ENTER(l); - - if ((method = sc_for_req_method(s->method, - strlen(s->method))) == UNKNOWN_METHOD) - method = SC_M_JK_STORED; - - if (jk_b_append_byte(msg, JK_AJP13_FORWARD_REQUEST) || - jk_b_append_byte(msg, (unsigned char)method) || - jk_b_append_string(msg, s->protocol) || - jk_b_append_string(msg, s->req_uri) || - jk_b_append_string(msg, s->remote_addr) || - jk_b_append_string(msg, s->remote_host) || - jk_b_append_string(msg, s->server_name) || - jk_b_append_int(msg, (unsigned short)s->server_port) || - jk_b_append_byte(msg, (unsigned char)(s->is_ssl)) || - jk_b_append_int(msg, (unsigned short)(s->num_headers))) { - - jk_log(l, JK_LOG_ERROR, - "failed appending the message begining"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - for (i = 0; i < s->num_headers; i++) { - int sc; - - if ((sc = sc_for_req_header(s->headers_names[i])) != UNKNOWN_METHOD) { - if (jk_b_append_int(msg, (unsigned short)sc)) { - jk_log(l, JK_LOG_ERROR, - "failed appending the header name"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - else { - if (jk_b_append_string(msg, s->headers_names[i])) { - jk_log(l, JK_LOG_ERROR, - "failed appending the header name"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - - if (jk_b_append_string(msg, s->headers_values[i])) { - jk_log(l, JK_LOG_ERROR, - "failed appending the header value"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - - if (s->secret) { - if (jk_b_append_byte(msg, SC_A_SECRET) || - jk_b_append_string(msg, s->secret)) { - jk_log(l, JK_LOG_ERROR, - "failed appending secret"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - - if (s->remote_user) { - if (jk_b_append_byte(msg, SC_A_REMOTE_USER) || - jk_b_append_string(msg, s->remote_user)) { - jk_log(l, JK_LOG_ERROR, - "failed appending the remote user"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - if (s->auth_type) { - if (jk_b_append_byte(msg, SC_A_AUTH_TYPE) || - jk_b_append_string(msg, s->auth_type)) { - jk_log(l, JK_LOG_ERROR, - "failed appending the auth type"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - if (s->query_string) { - if (jk_b_append_byte(msg, SC_A_QUERY_STRING) || -#if defined(AS400) && !defined(AS400_UTF8) - jk_b_append_asciistring(msg, s->query_string)) { -#else - jk_b_append_string(msg, s->query_string)) { -#endif - jk_log(l, JK_LOG_ERROR, - "failed appending the query string"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - if (s->route) { - if (jk_b_append_byte(msg, SC_A_ROUTE) || - jk_b_append_string(msg, s->route)) { - jk_log(l, JK_LOG_ERROR, - "failed appending the route"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - if (s->ssl_cert_len) { - if (jk_b_append_byte(msg, SC_A_SSL_CERT) || - jk_b_append_string(msg, s->ssl_cert)) { - jk_log(l, JK_LOG_ERROR, - "failed appending the SSL certificates"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - - if (s->ssl_cipher) { - if (jk_b_append_byte(msg, SC_A_SSL_CIPHER) || - jk_b_append_string(msg, s->ssl_cipher)) { - jk_log(l, JK_LOG_ERROR, - "failed appending the SSL ciphers"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - if (s->ssl_session) { - if (jk_b_append_byte(msg, SC_A_SSL_SESSION) || - jk_b_append_string(msg, s->ssl_session)) { - jk_log(l, JK_LOG_ERROR, - "failed appending the SSL session"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - - /* - * ssl_key_size is required by Servlet 2.3 API - * added support only in ajp14 mode - * JFC removed: ae->proto == AJP14_PROTO - */ - if (s->ssl_key_size != -1) { - if (jk_b_append_byte(msg, SC_A_SSL_KEY_SIZE) || - jk_b_append_int(msg, (unsigned short)s->ssl_key_size)) { - jk_log(l, JK_LOG_ERROR, - "failed appending the SSL key size"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - - /* If the method was unrecognized, encode it as an attribute */ - if (method == SC_M_JK_STORED) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, "unknown method %s", s->method); - if (jk_b_append_byte(msg, SC_A_STORED_METHOD) || - jk_b_append_string(msg, s->method)) { - jk_log(l, JK_LOG_ERROR, - "failed appending the request method"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - - /* Forward the remote port information, which was forgotten - * from the builtin data of the AJP 13 protocol. - * Since the servlet spec allows to retrieve it via getRemotePort(), - * we provide the port to the Tomcat connector as a request - * attribute. Modern Tomcat versions know how to retrieve - * the remote port from this attribute. - */ - { - if (jk_b_append_byte(msg, SC_A_REQ_ATTRIBUTE) || - jk_b_append_string(msg, SC_A_REQ_REMOTE_PORT) || - jk_b_append_string(msg, s->remote_port)) { - jk_log(l, JK_LOG_ERROR, - "failed appending the remote port %s", - s->remote_port); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - - /* Forward activation information from the load balancer. - * It can be used by the backend to deny access by requests, - * which come with a session id but for an invalid session. - * Such requests get forwarded to backends even if they - * are disabled" in the load balancer, because the balancer - * does not know, which sessions are valid. - * If the backend can check, that is was "disabled" it can - * delete the session cookie and respond with a self-referential - * redirect. The new request will then be balanced to some - * other node that is not disabled. - */ - { - if (jk_b_append_byte(msg, SC_A_REQ_ATTRIBUTE) || - jk_b_append_string(msg, SC_A_JK_LB_ACTIVATION) || - jk_b_append_string(msg, s->activation)) { - jk_log(l, JK_LOG_ERROR, - "failed appending the activation state %s", - s->activation); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - - if (s->num_attributes > 0) { - for (i = 0; i < s->num_attributes; i++) { - if (jk_b_append_byte(msg, SC_A_REQ_ATTRIBUTE) || - jk_b_append_string(msg, s->attributes_names[i]) || - jk_b_append_string(msg, s->attributes_values[i])) { - jk_log(l, JK_LOG_ERROR, - "failed appending attribute %s=%s", - s->attributes_names[i], s->attributes_values[i]); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - } - - if (jk_b_append_byte(msg, SC_A_ARE_DONE)) { - jk_log(l, JK_LOG_ERROR, - "failed appending the message end"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, "ajp marshaling done"); - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -/* -AJPV13_RESPONSE/AJPV14_RESPONSE:= - response_prefix (2) - status (short) - status_msg (short) - num_headers (short) - num_headers*(res_header_name header_value) - *body_chunk - terminator boolean - -req_header_name := - sc_req_header_name | (string) - -res_header_name := - sc_res_header_name | (string) - -header_value := - (string) - -body_chunk := - length (short) - body length*(var binary) - - */ - - -static int ajp_unmarshal_response(jk_msg_buf_t *msg, - jk_res_data_t * d, - ajp_endpoint_t * ae, jk_logger_t *l) -{ - jk_pool_t *p = &ae->pool; - - JK_TRACE_ENTER(l); - - d->status = jk_b_get_int(msg); - if (!d->status) { - jk_log(l, JK_LOG_ERROR, - "NULL status"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - d->msg = (char *)jk_b_get_string(msg); - if (d->msg) { -#if (defined(AS400) && !defined(AS400_UTF8)) || defined(_OSD_POSIX) - jk_xlate_from_ascii(d->msg, strlen(d->msg)); -#endif - } - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "status = %d", d->status); - - d->num_headers = jk_b_get_int(msg); - d->header_names = d->header_values = NULL; - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Number of headers is = %d", - d->num_headers); - - if (d->num_headers) { - d->header_names = jk_pool_alloc(p, sizeof(char *) * d->num_headers); - d->header_values = jk_pool_alloc(p, sizeof(char *) * d->num_headers); - - if (d->header_names && d->header_values) { - unsigned int i; - for (i = 0; i < d->num_headers; i++) { - unsigned short name = jk_b_pget_int(msg, msg->pos); - - if ((name & 0XFF00) == 0XA000) { - jk_b_get_int(msg); - name = name & 0X00FF; - if (name <= SC_RES_HEADERS_NUM) { - d->header_names[i] = - (char *)long_res_header_for_sc(name); - } - else { - jk_log(l, JK_LOG_ERROR, - "No such sc (%d)", name); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - else { - d->header_names[i] = (char *)jk_b_get_string(msg); - if (!d->header_names[i]) { - jk_log(l, JK_LOG_ERROR, - "NULL header name"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } -#if (defined(AS400) && !defined(AS400_UTF8)) || defined(_OSD_POSIX) - jk_xlate_from_ascii(d->header_names[i], - strlen(d->header_names[i])); -#endif - - } - - d->header_values[i] = (char *)jk_b_get_string(msg); - if (!d->header_values[i]) { - jk_log(l, JK_LOG_ERROR, - "NULL header value"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - -#if (defined(AS400) && !defined(AS400_UTF8)) || defined(_OSD_POSIX) - jk_xlate_from_ascii(d->header_values[i], - strlen(d->header_values[i])); -#endif - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Header[%d] [%s] = [%s]", - i, d->header_names[i], d->header_values[i]); - } - } - } - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -/* - * Abort endpoint use - */ -static void ajp_abort_endpoint(ajp_endpoint_t * ae, int shutdown, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - if (shutdown == JK_TRUE && IS_VALID_SOCKET(ae->sd)) { - if (ae->hard_close) { - /* Force unclean connection close to communicate client write errors - * back to Tomcat by aborting AJP response writes. - */ - jk_close_socket(ae->sd, l); - } - else { - jk_shutdown_socket(ae->sd, l); - } - } - ae->worker->s->connected--; - ae->sd = JK_INVALID_SOCKET; - ae->last_op = JK_AJP13_END_RESPONSE; - JK_TRACE_EXIT(l); -} - -/* - * Reset the endpoint (clean buf and close socket) - */ -static void ajp_reset_endpoint(ajp_endpoint_t * ae, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "(%s) resetting endpoint with socket %d%s", - ae->worker->name, ae->sd, ae->reuse? "" : " (socket shutdown)"); - if (!ae->reuse) { - ajp_abort_endpoint(ae, JK_TRUE, l); - } - jk_reset_pool(&(ae->pool)); - JK_TRACE_EXIT(l); -} - -/* - * Close the endpoint (close pool and close socket) - */ -void ajp_close_endpoint(ajp_endpoint_t * ae, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "(%s) closing endpoint with socket %d%s", - ae->worker->name, ae->sd, ae->reuse ? "" : " (socket shutdown)"); - if (IS_VALID_SOCKET(ae->sd)) { - jk_shutdown_socket(ae->sd, l); - } - ae->sd = JK_INVALID_SOCKET; - jk_close_pool(&(ae->pool)); - free(ae); - JK_TRACE_EXIT(l); -} - - -/** Steal a connection from an idle cache endpoint - * @param ae endpoint that needs a new connection - * @param l logger - * @return JK_FALSE: failure - * JK_TRUE: success - * @remark Always closes old socket endpoint - */ -static int ajp_next_connection(ajp_endpoint_t *ae, jk_logger_t *l) -{ - int rc; - int ret = JK_FALSE; - ajp_worker_t *aw = ae->worker; - - JK_TRACE_ENTER(l); - - /* Close previous socket */ - if (IS_VALID_SOCKET(ae->sd)) - jk_shutdown_socket(ae->sd, l); - /* Mark existing endpoint socket as closed */ - ae->sd = JK_INVALID_SOCKET; - JK_ENTER_CS(&aw->cs, rc); - if (rc) { - unsigned int i; - for (i = 0; i < aw->ep_cache_sz; i++) { - /* Find cache slot with usable socket */ - if (aw->ep_cache[i] && IS_VALID_SOCKET(aw->ep_cache[i]->sd)) { - ae->sd = aw->ep_cache[i]->sd; - aw->ep_cache[i]->sd = JK_INVALID_SOCKET; - break; - } - } - JK_LEAVE_CS(&aw->cs, rc); - if (IS_VALID_SOCKET(ae->sd)) { - ret = JK_TRUE; - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "(%s) Will try pooled connection socket %d from slot %d", - ae->worker->name, ae->sd, i); - } - } - JK_TRACE_EXIT(l); - return ret; -} - -/** Handle the cping/cpong query - * @param ae endpoint - * @param timeout wait timeout in milliseconds - * @param l logger - * @return JK_FALSE: failure - * JK_TRUE: success - * @remark Always closes socket in case of - * a socket error - */ -static int ajp_handle_cping_cpong(ajp_endpoint_t * ae, int timeout, jk_logger_t *l) -{ - int i; - int cmd; - jk_msg_buf_t *msg; - - JK_TRACE_ENTER(l); - - ae->last_errno = 0; - msg = jk_b_new(&ae->pool); - if (!msg) { - jk_log(l, JK_LOG_ERROR, - "Failed allocating AJP message"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - if (jk_b_set_buffer_size(msg, 16)) { - jk_log(l, JK_LOG_ERROR, - "Failed allocating AJP message buffer"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - jk_b_reset(msg); - jk_b_append_byte(msg, AJP13_CPING_REQUEST); - - /* Send CPing query */ - if (ajp_connection_tcp_send_message(ae, msg, l) != JK_TRUE) { - jk_log(l, JK_LOG_INFO, - "can't send cping query"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - for (i = 0; i < 2; i++) { - /* wait for Pong reply for timeout milliseconds - */ - if (jk_is_input_event(ae->sd, timeout, l) == JK_FALSE) { - ae->last_errno = errno; - jk_log(l, JK_LOG_INFO, "timeout in reply cpong"); - /* We can't trust this connection any more. */ - ajp_abort_endpoint(ae, JK_TRUE, l); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - /* Read and check for Pong reply - */ - if (ajp_connection_tcp_get_message(ae, msg, l) != JK_TRUE) { - jk_log(l, JK_LOG_INFO, - "awaited reply cpong, not received"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if ((cmd = jk_b_get_byte(msg)) != AJP13_CPONG_REPLY) { - /* If the respose was not CPONG it means that - * the previous response was not consumed by the - * client but the AJP messages was already in - * the network buffer. - * silently drop this single extra packet instead - * recycling the connection - */ - if (i || ae->last_op == JK_AJP13_END_RESPONSE || - cmd < JK_AJP13_SEND_BODY_CHUNK || - cmd > AJP13_CPONG_REPLY) { - jk_log(l, JK_LOG_WARNING, - "awaited reply cpong, received %d instead. " - "Closing connection", - cmd); - /* We can't trust this connection any more. */ - ajp_abort_endpoint(ae, JK_TRUE, l); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - else { - jk_log(l, JK_LOG_INFO, - "awaited reply cpong, received %d instead. " - "Retrying next packet", - cmd); - - } - } - else { - ae->last_op = AJP13_CPONG_REPLY; - /* We have received Pong reply */ - break; - } - } - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -/** Connect an endpoint to a backend - * @param ae endpoint - * @param l logger - * @return JK_FALSE: failure - * JK_TRUE: success - * @remark Always closes socket in case of - * a socket error - * @remark Cares about ae->last_errno - */ -int ajp_connect_to_endpoint(ajp_endpoint_t * ae, jk_logger_t *l) -{ - char buf[32]; - int rc = JK_TRUE; - - JK_TRACE_ENTER(l); - - ae->last_errno = 0; - ae->sd = jk_open_socket(&ae->worker->worker_inet_addr, - ae->worker->keepalive, - ae->worker->socket_timeout, - ae->worker->socket_connect_timeout, - ae->worker->socket_buf, l); - - if (!IS_VALID_SOCKET(ae->sd)) { - ae->last_errno = errno; - jk_log(l, JK_LOG_INFO, - "Failed opening socket to (%s) (errno=%d)", - jk_dump_hinfo(&ae->worker->worker_inet_addr, buf), ae->last_errno); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - ae->worker->s->connected++; - /* set last_access only if needed */ - if (ae->worker->cache_timeout > 0) - ae->last_access = time(NULL); - /* Check if we must execute a logon after the physical connect */ - /* XXX: Not sure, if we really should do logon before cping/cpong */ - /* XXX: and if no cping/cpong is allowed before or after logon. */ - if (ae->worker->logon != NULL) { - rc = ae->worker->logon(ae, l); - if (rc == JK_FALSE) { - jk_log(l, JK_LOG_ERROR, - "(%s) ajp14 worker logon to the backend server failed", - ae->worker->name); - /* Close the socket if unable to logon */ - ajp_abort_endpoint(ae, JK_TRUE, l); - } - } - /* XXX: Should we send a cping also after logon to validate the connection? */ - else if (ae->worker->connect_timeout > 0) { - rc = ajp_handle_cping_cpong(ae, ae->worker->connect_timeout, l); - if (rc == JK_FALSE) - jk_log(l, JK_LOG_ERROR, - "(%s) cping/cpong after connecting to the backend server failed (errno=%d)", - ae->worker->name, ae->last_errno); - } - JK_TRACE_EXIT(l); - return rc; -} - -/* Syncing config values from shm */ -void jk_ajp_pull(ajp_worker_t * aw, int locked, jk_logger_t *l) -{ - int address_change = JK_FALSE; - int port = 0; - char host[JK_SHM_STR_SIZ+1]; - struct sockaddr_in inet_addr; - JK_TRACE_ENTER(l); - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "syncing mem for ajp worker '%s' from shm (%u -> %u) [%u->%u]", - aw->name, aw->sequence, aw->s->h.sequence, aw->addr_sequence, aw->s->addr_sequence); - if (locked == JK_FALSE) - jk_shm_lock(); - - aw->cache_timeout = aw->s->cache_timeout; - aw->connect_timeout = aw->s->connect_timeout; - aw->ping_timeout = aw->s->ping_timeout; - aw->reply_timeout = aw->s->reply_timeout; - aw->prepost_timeout = aw->s->prepost_timeout; - aw->recovery_opts = aw->s->recovery_opts; - aw->retries = aw->s->retries; - aw->retry_interval = aw->s->retry_interval; - aw->max_packet_size = aw->s->max_packet_size; - aw->sequence = aw->s->h.sequence; - if (aw->addr_sequence != aw->s->addr_sequence) { - address_change = JK_TRUE; - aw->addr_sequence = aw->s->addr_sequence; - strncpy(host, aw->s->host, JK_SHM_STR_SIZ); - port = aw->s->port; - } - if (locked == JK_FALSE) - jk_shm_unlock(); - - if (address_change == JK_TRUE) { - if (!jk_resolve(host, port, &inet_addr, - aw->worker.we->pool, l)) { - jk_log(l, JK_LOG_ERROR, - "Failed resolving address '%s:%d' for worker '%s'.", - host, port, aw->name); - } - else { - int rc; - JK_ENTER_CS(&aw->cs, rc); - if (rc) { - unsigned int i; - for (i = 0; i < aw->ep_cache_sz; i++) { - /* Close all connections in the cache */ - if (aw->ep_cache[i] && IS_VALID_SOCKET(aw->ep_cache[i]->sd)) { - int sd = aw->ep_cache[i]->sd; - aw->ep_cache[i]->sd = JK_INVALID_SOCKET; - aw->ep_cache[i]->addr_sequence = aw->addr_sequence; - jk_shutdown_socket(sd, l); - aw->s->connected--; - } - } - } - aw->port = port; - strncpy(aw->host, host, JK_SHM_STR_SIZ); - memcpy(&(aw->worker_inet_addr), &inet_addr, sizeof(inet_addr)); - if (rc) { - JK_LEAVE_CS(&aw->cs, rc); - } else { - jk_log(l, JK_LOG_ERROR, - "locking thread (errno=%d)", errno); - } - } - } - - JK_TRACE_EXIT(l); -} - -/* Syncing config values to shm */ -void jk_ajp_push(ajp_worker_t * aw, int locked, jk_logger_t *l) -{ - int address_change = JK_FALSE; - - JK_TRACE_ENTER(l); - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "syncing shm for ajp worker '%s' from mem (%u -> %u) [%u->%u]", - aw->name, aw->s->h.sequence, aw->sequence, aw->s->addr_sequence, aw->addr_sequence); - if (locked == JK_FALSE) - jk_shm_lock(); - - aw->s->cache_timeout = aw->cache_timeout; - aw->s->connect_timeout = aw->connect_timeout; - aw->s->ping_timeout = aw->ping_timeout; - aw->s->reply_timeout = aw->reply_timeout; - aw->s->prepost_timeout = aw->prepost_timeout; - aw->s->recovery_opts = aw->recovery_opts; - aw->s->retries = aw->retries; - aw->s->retry_interval = aw->retry_interval; - aw->s->max_packet_size = aw->max_packet_size; - aw->s->h.sequence = aw->sequence; - if (aw->s->addr_sequence != aw->addr_sequence) { - address_change = JK_TRUE; - strncpy(aw->s->host, aw->host, JK_SHM_STR_SIZ); - aw->s->port = aw->port; - aw->s->addr_sequence = aw->addr_sequence; - } - if (locked == JK_FALSE) - jk_shm_unlock(); - - if (address_change == JK_TRUE) { - int rc; - JK_ENTER_CS(&aw->cs, rc); - if (rc) { - unsigned int i; - for (i = 0; i < aw->ep_cache_sz; i++) { - /* Close all connections in the cache */ - if (aw->ep_cache[i] && IS_VALID_SOCKET(aw->ep_cache[i]->sd)) { - int sd = aw->ep_cache[i]->sd; - aw->ep_cache[i]->sd = JK_INVALID_SOCKET; - aw->ep_cache[i]->addr_sequence = aw->addr_sequence; - jk_shutdown_socket(sd, l); - aw->s->connected--; - } - } - JK_LEAVE_CS(&aw->cs, rc); - } else { - jk_log(l, JK_LOG_ERROR, - "locking thread (errno=%d)", errno); - } - } - JK_TRACE_EXIT(l); -} - -/** Send a message to an endpoint, using corresponding PROTO HEADER - * @param ae endpoint - * @param msg message to send - * @param l logger - * @return JK_FATAL_ERROR: endpoint contains unknown protocol - * JK_FALSE: other failure - * JK_TRUE: success - * @remark Always closes socket in case of - * a socket error, or JK_FATAL_ERROR - * @remark Cares about ae->last_errno - */ -int ajp_connection_tcp_send_message(ajp_endpoint_t * ae, - jk_msg_buf_t *msg, jk_logger_t *l) -{ - int rc; - - JK_TRACE_ENTER(l); - - ae->last_errno = 0; - if (ae->proto == AJP13_PROTO) { - jk_b_end(msg, AJP13_WS_HEADER); - if (JK_IS_DEBUG_LEVEL(l)) - jk_dump_buff(l, JK_LOG_DEBUG, "sending to ajp13", msg); - } - else if (ae->proto == AJP14_PROTO) { - jk_b_end(msg, AJP14_WS_HEADER); - if (JK_IS_DEBUG_LEVEL(l)) - jk_dump_buff(l, JK_LOG_DEBUG, "sending to ajp14", msg); - } - else { - jk_log(l, JK_LOG_ERROR, - "(%s) unknown protocol %d, supported are AJP13/AJP14", - ae->worker->name, ae->proto); - /* We've got a protocol error. */ - /* We can't trust this connection any more, */ - /* because we might have send already parts of the request. */ - ajp_abort_endpoint(ae, JK_TRUE, l); - JK_TRACE_EXIT(l); - return JK_FATAL_ERROR; - } - - /* This is the only place in this function where we use the socket. */ - /* If sendfull gets an error, it implicitely closes the socket. */ - /* So any socket error inside ajp_connection_tcp_send_message */ - /* results in a socket close and invalidated endpoint connection. */ - if ((rc = jk_tcp_socket_sendfull(ae->sd, msg->buf, - msg->len, l)) > 0) { - ae->endpoint.wr += (jk_uint64_t)rc; - JK_TRACE_EXIT(l); - return JK_TRUE; - } - ae->last_errno = errno; - jk_log(l, JK_LOG_INFO, - "sendfull for socket %d returned %d (errno=%d)", - ae->sd, rc, ae->last_errno); - ajp_abort_endpoint(ae, JK_FALSE, l); - JK_TRACE_EXIT(l); - return JK_FALSE; -} - -/** Receive a message from an endpoint, checking PROTO HEADER - * @param ae endpoint - * @param msg message to send - * @param l logger - * @return JK_TRUE: success - * JK_FALSE: could not read the AJP packet header - * JK_AJP_PROTOCOL_ERROR: failure after reading - * the AJP packet header - * @remark Always closes socket in case of - * a socket error - * @remark Cares about ae->last_errno - */ -int ajp_connection_tcp_get_message(ajp_endpoint_t * ae, - jk_msg_buf_t *msg, jk_logger_t *l) -{ - unsigned char head[AJP_HEADER_LEN]; - int rc; - int msglen; - unsigned int header; - char buf[32]; - - JK_TRACE_ENTER(l); - - ae->last_errno = 0; - /* If recvfull gets an error, it implicitely closes the socket. */ - /* We will invalidate the endpoint connection. */ - rc = jk_tcp_socket_recvfull(ae->sd, head, AJP_HEADER_LEN, l); - - /* If the return code is not negative */ - /* then we always get back the correct number of bytes. */ - if (rc < 0) { - if (rc == JK_SOCKET_EOF) { - ae->last_errno = EPIPE; - jk_log(l, JK_LOG_INFO, - "(%s) can't receive the response header message from tomcat, " - "tomcat (%s) has forced a connection close for socket %d", - ae->worker->name, jk_dump_hinfo(&ae->worker->worker_inet_addr, buf), - ae->sd); - } - else { - ae->last_errno = -rc; - jk_log(l, JK_LOG_INFO, - "(%s) can't receive the response header message from tomcat, " - "network problems or tomcat (%s) is down (errno=%d)", - ae->worker->name, jk_dump_hinfo(&ae->worker->worker_inet_addr, buf), - ae->last_errno); - } - ajp_abort_endpoint(ae, JK_FALSE, l); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - ae->endpoint.rd += (jk_uint64_t)rc; - header = ((unsigned int)head[0] << 8) | head[1]; - - if (ae->proto == AJP13_PROTO) { - if (header != AJP13_SW_HEADER) { - - if (header == AJP14_SW_HEADER) { - jk_log(l, JK_LOG_ERROR, - "received AJP14 reply on an AJP13 connection from %s", - jk_dump_hinfo(&ae->worker->worker_inet_addr, buf)); - } - else { - jk_log(l, JK_LOG_ERROR, - "wrong message format 0x%04x from %s", - header, jk_dump_hinfo(&ae->worker->worker_inet_addr, - buf)); - } - /* We've got a protocol error. */ - /* We can't trust this connection any more. */ - ajp_abort_endpoint(ae, JK_TRUE, l); - JK_TRACE_EXIT(l); - return JK_AJP_PROTOCOL_ERROR; - } - } - else if (ae->proto == AJP14_PROTO) { - if (header != AJP14_SW_HEADER) { - - if (header == AJP13_SW_HEADER) { - jk_log(l, JK_LOG_ERROR, - "received AJP13 reply on an AJP14 connection from %s", - jk_dump_hinfo(&ae->worker->worker_inet_addr, buf)); - } - else { - jk_log(l, JK_LOG_ERROR, - "wrong message format 0x%04x from %s", - header, jk_dump_hinfo(&ae->worker->worker_inet_addr, - buf)); - } - /* We've got a protocol error. */ - /* We can't trust this connection any more. */ - ajp_abort_endpoint(ae, JK_TRUE, l); - JK_TRACE_EXIT(l); - return JK_AJP_PROTOCOL_ERROR; - } - } - - msglen = ((head[2] & 0xff) << 8); - msglen += (head[3] & 0xFF); - - if (msglen > msg->maxlen) { - jk_log(l, JK_LOG_ERROR, - "wrong message size %d %d from %s", - msglen, msg->maxlen, - jk_dump_hinfo(&ae->worker->worker_inet_addr, buf)); - /* We've got a protocol error. */ - /* We can't trust this connection any more. */ - ajp_abort_endpoint(ae, JK_TRUE, l); - JK_TRACE_EXIT(l); - return JK_AJP_PROTOCOL_ERROR; - } - - msg->len = msglen; - msg->pos = 0; - - /* If recvfull gets an error, it implicitely closes the socket. */ - /* We will invalidate the endpoint connection. */ - rc = jk_tcp_socket_recvfull(ae->sd, msg->buf, msglen, l); - /* If the return code is not negative */ - /* then we always get back the correct number of bytes. */ - if (rc < 0) { - if (rc == JK_SOCKET_EOF) { - ae->last_errno = EPIPE; - jk_log(l, JK_LOG_ERROR, - "(%s) can't receive the response body message from tomcat, " - "tomcat (%s) has forced a connection close for socket %d", - ae->worker->name, jk_dump_hinfo(&ae->worker->worker_inet_addr, buf), - ae->sd); - } - else { - ae->last_errno = -rc; - jk_log(l, JK_LOG_ERROR, - "(%s) can't receive the response body message from tomcat, " - "network problems or tomcat (%s) is down (errno=%d)", - ae->worker->name, jk_dump_hinfo(&ae->worker->worker_inet_addr, buf), - ae->last_errno); - } - ajp_abort_endpoint(ae, JK_FALSE, l); - JK_TRACE_EXIT(l); - /* Although we have a connection, this is effectively a protocol error. - * We received the AJP header packet, but not the packet payload - */ - return JK_AJP_PROTOCOL_ERROR; - } - ae->endpoint.rd += (jk_uint64_t)rc; - - if (JK_IS_DEBUG_LEVEL(l)) { - if (ae->proto == AJP13_PROTO) - jk_dump_buff(l, JK_LOG_DEBUG, "received from ajp13", msg); - else if (ae->proto == AJP14_PROTO) - jk_dump_buff(l, JK_LOG_DEBUG, "received from ajp14", msg); - } - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -/* - * Read all the data from the socket. - * - * Socket API doesn't guaranty that all the data will be kept in a - * single read, so we must loop until all awaited data is received - */ - -static int ajp_read_fully_from_server(jk_ws_service_t *s, jk_logger_t *l, - unsigned char *buf, unsigned int len) -{ - unsigned int rdlen = 0; - unsigned int padded_len = len; - - JK_TRACE_ENTER(l); - - if (s->is_chunked && s->no_more_chunks) { - JK_TRACE_EXIT(l); - return 0; - } - if (s->is_chunked) { - /* Corner case: buf must be large enough to hold next - * chunk size (if we're on or near a chunk border). - * Pad the length to a reasonable value, otherwise the - * read fails and the remaining chunks are tossed. - */ - padded_len = (len < CHUNK_BUFFER_PAD) ? len : len - CHUNK_BUFFER_PAD; - } - - while (rdlen < padded_len) { - unsigned int this_time = 0; - if (!s->read(s, buf + rdlen, len - rdlen, &this_time)) { - /* Remote Client read failed. */ - JK_TRACE_EXIT(l); - return JK_CLIENT_RD_ERROR; - } - - if (0 == this_time) { - if (s->is_chunked) { - s->no_more_chunks = 1; /* read no more */ - } - break; - } - rdlen += this_time; - } - - JK_TRACE_EXIT(l); - return (int)rdlen; -} - - -/* - * Read data from AJP13/AJP14 protocol - * Returns -1 on error, else number of bytes read - */ - -static int ajp_read_into_msg_buff(ajp_endpoint_t * ae, - jk_ws_service_t *r, - jk_msg_buf_t *msg, int len, jk_logger_t *l) -{ - unsigned char *read_buf = msg->buf; - - JK_TRACE_ENTER(l); - - jk_b_reset(msg); - - read_buf += AJP_HEADER_LEN; /* leave some space for the buffer headers */ - read_buf += AJP_HEADER_SZ_LEN; /* leave some space for the read length */ - - /* Pick the max size since we don't know the content_length */ - if (r->is_chunked && len == 0) { - len = AJP13_MAX_SEND_BODY_SZ; - } - - if ((len = ajp_read_fully_from_server(r, l, read_buf, len)) < 0) { - jk_log(l, JK_LOG_INFO, - "(%s) receiving data from client failed. " - "Connection aborted or network problems", - ae->worker->name); - JK_TRACE_EXIT(l); - return JK_CLIENT_RD_ERROR; - } - - if (!r->is_chunked) { - ae->left_bytes_to_send -= len; - } - - if (len > 0) { - /* Recipient recognizes empty packet as end of stream, not - an empty body packet */ - if (0 != jk_b_append_int(msg, (unsigned short)len)) { - jk_log(l, JK_LOG_INFO, - "Failed appending message length"); - JK_TRACE_EXIT(l); - return JK_CLIENT_RD_ERROR; - } - } - - msg->len += len; - - JK_TRACE_EXIT(l); - return len; -} - - -/* - * send request to Tomcat via Ajp13 - * - first try to find reuseable socket - * - if no such available, try to connect - * - send request, but send must be seen as asynchronous, - * since send() call will return noerror about 95% of time - * Hopefully we'll get more information on next read. - * - * nb: op->request is the original request msg buffer - * op->reply is the reply msg buffer which could be scratched - * - * Return values of ajp_send_request() function: - * return value op->recoverable reason - * JK_FATAL_ERROR JK_FALSE ajp_connection_tcp_send_message() returns JK_FATAL_ERROR - * Endpoint belongs to unknown protocol. - * JK_FATAL_ERROR JK_TRUE ajp_connection_tcp_send_message() returns JK_FALSE - * Sending request or request body in jk_tcp_socket_sendfull() returns with error. - * JK_FATAL_ERROR JK_TRUE Could not connect to backend - * JK_CLIENT_RD_ERROR JK_FALSE Error during reading parts of POST body from client - * JK_TRUE JK_TRUE All other cases (OK) - */ -static int ajp_send_request(jk_endpoint_t *e, - jk_ws_service_t *s, - jk_logger_t *l, - ajp_endpoint_t * ae, ajp_operation_t * op) -{ - int err_conn = 0; - int err_cping = 0; - int err_send = 0; - int rc; - int postlen; - - JK_TRACE_ENTER(l); - - ae->last_errno = 0; - /* Up to now, we can recover */ - op->recoverable = JK_TRUE; - - /* Check if the previous request really ended - */ - if (ae->last_op != JK_AJP13_END_RESPONSE && - ae->last_op != AJP13_CPONG_REPLY) { - jk_log(l, JK_LOG_INFO, - "(%s) did not receive END_RESPONSE, " - "closing socket %d", - ae->worker->name, ae->sd); - ajp_abort_endpoint(ae, JK_TRUE, l); - } - /* - * First try to check open connections... - */ - while (IS_VALID_SOCKET(ae->sd)) { - int err = JK_FALSE; - if (jk_is_socket_connected(ae->sd, l) == JK_FALSE) { - ae->last_errno = errno; - jk_log(l, JK_LOG_DEBUG, - "(%s) failed sending request, " - "socket %d is not connected any more (errno=%d)", - ae->worker->name, ae->sd, ae->last_errno); - ajp_abort_endpoint(ae, JK_FALSE, l); - err = JK_TRUE; - err_conn++; - } - if (ae->worker->prepost_timeout > 0 && !err) { - /* handle cping/cpong if prepost_timeout is set - * If the socket is disconnected no need to handle - * the cping/cpong - */ - if (ajp_handle_cping_cpong(ae, - ae->worker->prepost_timeout, l) == JK_FALSE) { - jk_log(l, JK_LOG_INFO, - "(%s) failed sending request, " - "socket %d prepost cping/cpong failure (errno=%d)", - ae->worker->name, ae->sd, ae->last_errno); - /* XXX: Is there any reason to try other - * connections to the node if one of them fails - * the cping/cpong heartbeat? - * Tomcat can be either too busy or simply dead, so - * there is a chance that all other connections would - * fail as well. - */ - err = JK_TRUE; - err_cping++; - } - } - - /* We've got a connected socket and the optional - * cping/cpong worked, so let's send the request now. - */ - if (err == JK_FALSE) { - rc = ajp_connection_tcp_send_message(ae, op->request, l); - /* If this worked, we can break out of the loop - * and proceed with the request. - */ - if (rc == JK_TRUE) { - ae->last_op = JK_AJP13_FORWARD_REQUEST; - break; - } - /* Error during sending the request. - */ - err_send++; - if (rc == JK_FATAL_ERROR) - op->recoverable = JK_FALSE; - jk_log(l, JK_LOG_INFO, - "(%s) failed sending request (%srecoverable) " - "(errno=%d)", - ae->worker->name, - op->recoverable ? "" : "un", - ae->last_errno); - JK_TRACE_EXIT(l); - return JK_FATAL_ERROR; - } - /* If we got an error or can't send data, then try to steal another pooled - * connection and try again. If we are not successful, break out of this - * loop and try to open a new connection after the loop. - */ - if (ajp_next_connection(ae, l) == JK_FALSE) - break; - } - - /* - * If we failed to reuse a connection, try to reconnect. - */ - if (!IS_VALID_SOCKET(ae->sd)) { - /* Could not steal any connection from an endpoint - backend is disconnected */ - if (err_conn + err_cping + err_send > 0) - jk_log(l, JK_LOG_INFO, - "(%s) all endpoints are disconnected, " - "detected by connect check (%d), cping (%d), send (%d)", - ae->worker->name, err_conn, err_cping, err_send); - else if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "(%s) all endpoints are disconnected.", - ae->worker->name); - /* Connect to the backend. - */ - if (ajp_connect_to_endpoint(ae, l) != JK_TRUE) { - jk_log(l, JK_LOG_ERROR, - "(%s) connecting to backend failed. Tomcat is probably not started " - "or is listening on the wrong port (errno=%d)", - ae->worker->name, ae->last_errno); - JK_TRACE_EXIT(l); - return JK_FATAL_ERROR; - } - if (ae->worker->connect_timeout <= 0 && - ae->worker->prepost_timeout > 0) { - /* handle cping/cpong if prepost_timeout is set - * and we didn't already do a connect cping/cpong. - */ - if (ajp_handle_cping_cpong(ae, - ae->worker->prepost_timeout, l) == JK_FALSE) { - jk_log(l, JK_LOG_INFO, - "(%s) failed sending request, " - "socket %d prepost cping/cpong failure (errno=%d)", - ae->worker->name, ae->sd, ae->last_errno); - JK_TRACE_EXIT(l); - return JK_FATAL_ERROR; - } - } - - /* We've got a connected socket and the optional - * cping/cpong worked, so let's send the request now. - */ - rc = ajp_connection_tcp_send_message(ae, op->request, l); - /* Error during sending the request. - */ - if (rc != JK_TRUE) { - if (rc == JK_FATAL_ERROR) - op->recoverable = JK_FALSE; - jk_log(l, JK_LOG_ERROR, - "(%s) failed sending request on a fresh connection (%srecoverable), " - "socket %d (errno=%d)", - ae->worker->name, op->recoverable ? "" : "un", - ae->sd, ae->last_errno); - JK_TRACE_EXIT(l); - return JK_FATAL_ERROR; - } - ae->last_op = JK_AJP13_FORWARD_REQUEST; - } - else if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "(%s) Statistics about invalid connections: " - "connect check (%d), cping (%d), send (%d)", - ae->worker->name, err_conn, err_cping, err_send); - - /* - * From now on an error means that we have an internal server error - * or Tomcat crashed. - */ - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "(%s) request body to send %" JK_UINT64_T_FMT " - request body to resend %d", - ae->worker->name, ae->left_bytes_to_send, - op->reply->len - AJP_HEADER_LEN); - - /* - * POST recovery job is done here and will work when data to - * POST are less than 8k, since it's the maximum size of op-post buffer. - * We send here the first part of data which was sent previously to the - * remote Tomcat - */ - - /* Did we have something to resend (ie the op-post has been feeded previously */ - - postlen = op->post->len; - if (postlen > AJP_HEADER_LEN) { - rc = ajp_connection_tcp_send_message(ae, op->post, l); - /* Error during sending the request body. - */ - if (rc != JK_TRUE) { - if (rc == JK_FATAL_ERROR) - op->recoverable = JK_FALSE; - jk_log(l, JK_LOG_ERROR, - "(%s) failed sending request body of size %d (%srecoverable), " - "socket %d (errno=%d)", - ae->worker->name, postlen, op->recoverable ? "" : "un", - ae->sd, ae->last_errno); - JK_TRACE_EXIT(l); - return JK_FATAL_ERROR; - } - else { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, "Resent the request body (%d)", - postlen); - } - } - else if (s->reco_status == RECO_FILLED) { - /* Recovery in LB MODE */ - postlen = s->reco_buf->len; - - if (postlen > AJP_HEADER_LEN) { - rc = ajp_connection_tcp_send_message(ae, s->reco_buf, l); - /* Error during sending the request body. - */ - if (rc != JK_TRUE) { - if (rc == JK_FATAL_ERROR) - op->recoverable = JK_FALSE; - jk_log(l, JK_LOG_ERROR, - "(%s) failed sending request body of size %d (lb mode) (%srecoverable), " - "socket %d (errno=%d)", - ae->worker->name, postlen, op->recoverable ? "" : "un", - ae->sd, ae->last_errno); - JK_TRACE_EXIT(l); - return JK_FATAL_ERROR; - } - } - else { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Resent the request body (lb mode) (%d)", postlen); - } - } - else { - /* We never sent any POST data and we check if we have to send at - * least one block of data (max 8k). These data will be kept in reply - * for resend if the remote Tomcat is down, a fact we will learn only - * doing a read (not yet) - */ - /* || s->is_chunked - this can't be done here. The original protocol - sends the first chunk of post data ( based on Content-Length ), - and that's what the java side expects. - Sending this data for chunked would break other ajp13 servers. - - Note that chunking will continue to work - using the normal read. - */ - - if (ae->left_bytes_to_send > 0) { - int len = AJP13_MAX_SEND_BODY_SZ; - if (ae->left_bytes_to_send < (jk_uint64_t)AJP13_MAX_SEND_BODY_SZ) { - len = (int)ae->left_bytes_to_send; - } - if ((len = ajp_read_into_msg_buff(ae, s, op->post, len, l)) <= 0) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "(%s) browser stop sending data, no need to recover", - ae->worker->name); - op->recoverable = JK_FALSE; - /* Send an empty POST message since per AJP protocol - * spec whenever we have content length the message - * packet must be followed with initial POST packet. - * Size zero will be handled as error in container. - */ - jk_b_reset(op->post); - jk_b_append_int(op->post, 0); - ajp_connection_tcp_send_message(ae, op->post, l); - JK_TRACE_EXIT(l); - return JK_CLIENT_RD_ERROR; - } - - /* If a RECOVERY buffer is available in LB mode, fill it */ - if (s->reco_status == RECO_INITED) { - jk_b_copy(op->post, s->reco_buf); - s->reco_status = RECO_FILLED; - } - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "(%s) sending %d bytes of request body", - ae->worker->name, len); - - s->content_read = (jk_uint64_t)len; - rc = ajp_connection_tcp_send_message(ae, op->post, l); - /* Error during sending the request body. - */ - if (rc != JK_TRUE) { - if (rc == JK_FATAL_ERROR) - op->recoverable = JK_FALSE; - jk_log(l, JK_LOG_ERROR, - "(%s) failed sending request body of size %d (%srecoverable), " - "socket %d (errno=%d)", - ae->worker->name, len, op->recoverable ? "" : "un", - ae->sd, ae->last_errno); - JK_TRACE_EXIT(l); - return JK_FATAL_ERROR; - } - } - } - JK_TRACE_EXIT(l); - return JK_TRUE; -} - - -/* - * What to do with incoming data (dispatcher) - */ - -static int ajp_process_callback(jk_msg_buf_t *msg, - jk_msg_buf_t *pmsg, - ajp_endpoint_t * ae, - jk_ws_service_t *r, jk_logger_t *l) -{ - int code = (int)jk_b_get_byte(msg); - - JK_TRACE_ENTER(l); - - switch (code) { - case JK_AJP13_SEND_HEADERS: - { - int rc; - jk_res_data_t res; - if (ae->last_op == JK_AJP13_SEND_HEADERS) { - /* Do not send anything to the client. - * Backend already send us the headers. - */ - if (JK_IS_DEBUG_LEVEL(l)) { - jk_log(l, JK_LOG_DEBUG, - "Already received AJP13_SEND HEADERS"); - } - JK_TRACE_EXIT(l); - return JK_AJP13_ERROR; - } - if (!ajp_unmarshal_response(msg, &res, ae, l)) { - jk_log(l, JK_LOG_ERROR, - "ajp_unmarshal_response failed"); - JK_TRACE_EXIT(l); - return JK_AJP13_ERROR; - } - r->http_response_status = res.status; - if (r->extension.fail_on_status_size > 0) - rc = is_http_status_fail(r->extension.fail_on_status_size, - r->extension.fail_on_status, res.status); - else - rc = is_http_status_fail(ae->worker->http_status_fail_num, - ae->worker->http_status_fail, res.status); - if (rc > 0) { - JK_TRACE_EXIT(l); - return JK_STATUS_FATAL_ERROR; - } - else if (rc < 0) { - JK_TRACE_EXIT(l); - return JK_STATUS_ERROR; - } - - if (r->extension.use_server_error_pages && - r->http_response_status >= r->extension.use_server_error_pages) - r->response_blocked = JK_TRUE; - - /* - * Call even if response is blocked, since it also handles - * forwarding some headers for special http status codes - * even if the server uses an own error page. - * Example: The WWW-Authenticate header in case of - * HTTP_UNAUTHORIZED (401). - */ - r->start_response(r, res.status, res.msg, - (const char *const *)res.header_names, - (const char *const *)res.header_values, - res.num_headers); - - if (!r->response_blocked) { - if (r->flush && r->flush_header) - r->flush(r); - } - } - return JK_AJP13_SEND_HEADERS; - - case JK_AJP13_SEND_BODY_CHUNK: - if (ae->last_op == JK_AJP13_FORWARD_REQUEST) { - /* AJP13_SEND_BODY_CHUNK with length 0 is - * explicit flush packet message. - * Ignore those if they are left over from previous responses. - * Reportedly some versions of JBoss suffer from that problem. - */ - if (jk_b_get_int(msg) == 0) { - jk_log(l, JK_LOG_DEBUG, - "Ignoring flush message received while sending the request"); - return ae->last_op; - } - /* We have just send a request but received something - * that probably originates from buffered response. - */ - if (JK_IS_DEBUG_LEVEL(l)) { - jk_log(l, JK_LOG_DEBUG, - "Unexpected AJP13_SEND_BODY_CHUNK"); - } - JK_TRACE_EXIT(l); - return JK_AJP13_ERROR; - } - if (!r->response_blocked) { - unsigned int len = (unsigned int)jk_b_get_int(msg); - /* - * Do a sanity check on len to prevent write reading beyond buffer - * boundaries and thus revealing possible sensitive memory - * contents to the client. - * len cannot be larger than msg->len - 3 because the ajp message - * contains the magic byte for JK_AJP13_SEND_BODY_CHUNK (1 byte) - * and the length of the chunk (2 bytes). The remaining part of - * the message is the chunk. - */ - if (len > (unsigned int)(msg->len - 3)) { - jk_log(l, JK_LOG_ERROR, - "Chunk length too large. Length of AJP message is %i," - " chunk length is %i.", msg->len, len); - JK_TRACE_EXIT(l); - return JK_INTERNAL_ERROR; - } - if (len == 0) { - /* AJP13_SEND_BODY_CHUNK with length 0 is - * explicit flush packet message. - */ - if (r->response_started) { - if (r->flush) { - r->flush(r); - } - } - else { - jk_log(l, JK_LOG_DEBUG, - "Ignoring flush message received before headers"); - } - } - else { - if (!r->write(r, msg->buf + msg->pos, len)) { - jk_log(l, JK_LOG_INFO, - "Writing to client aborted or client network problems"); - JK_TRACE_EXIT(l); - return JK_CLIENT_WR_ERROR; - } - if (r->flush && r->flush_packets) - r->flush(r); - } - } - break; - - case JK_AJP13_GET_BODY_CHUNK: - { - int len = (int)jk_b_get_int(msg); - - if (len < 0) { - len = 0; - } - if (len > AJP13_MAX_SEND_BODY_SZ) { - len = AJP13_MAX_SEND_BODY_SZ; - } - if ((jk_uint64_t)len > ae->left_bytes_to_send) { - len = (int)ae->left_bytes_to_send; - } - - /* the right place to add file storage for upload */ - if ((len = ajp_read_into_msg_buff(ae, r, pmsg, len, l)) >= 0) { - r->content_read += (jk_uint64_t)len; - JK_TRACE_EXIT(l); - return JK_AJP13_HAS_RESPONSE; - } - - jk_log(l, JK_LOG_INFO, - "Reading from client aborted or client network problems"); - - JK_TRACE_EXIT(l); - return JK_CLIENT_RD_ERROR; - } - break; - - case JK_AJP13_END_RESPONSE: - ae->reuse = (int)jk_b_get_byte(msg); - if (!ae->reuse) { - /* - * AJP13 protocol reuse flag set to false. - * Tomcat will close its side of the connection. - */ - jk_log(l, JK_LOG_WARNING, "AJP13 protocol: Reuse is set to false"); - } - else if (r->disable_reuse) { - if (JK_IS_DEBUG_LEVEL(l)) { - jk_log(l, JK_LOG_DEBUG, "AJP13 protocol: Reuse is disabled"); - } - ae->reuse = JK_FALSE; - } - else { - /* Reuse in all cases */ - if (JK_IS_DEBUG_LEVEL(l)) { - jk_log(l, JK_LOG_DEBUG, "AJP13 protocol: Reuse is OK"); - } - ae->reuse = JK_TRUE; - } - if (!r->response_blocked) { - if (r->done) { - /* Done with response */ - r->done(r); - } - else if (r->flush && !r->flush_packets) { - /* Flush after the last write */ - r->flush(r); - } - } - JK_TRACE_EXIT(l); - return JK_AJP13_END_RESPONSE; - break; - - default: - jk_log(l, JK_LOG_ERROR, - "Unknown AJP protocol code: %02X", code); - JK_TRACE_EXIT(l); - return JK_AJP13_ERROR; - } - - JK_TRACE_EXIT(l); - return JK_AJP13_NO_RESPONSE; -} - -/* - * get replies from Tomcat via Ajp13/Ajp14 - * ajp13/ajp14 is async but handling read/send this way prevent nice recovery - * In fact if tomcat link is broken during upload (browser -> apache -> tomcat) - * we'll loose data and we'll have to abort the whole request. - * - * Return values of ajp_get_reply() function: - * return value op->recoverable reason - * JK_REPLY_TIMEOUT ?recovery_options Reply timeout while waiting for response packet - * JK_FALSE ?recovery_options Error during ajp_connection_tcp_get_message() - * Could not read the AJP packet header - * JK_AJP_PROTOCOL_ERROR: ?recovery_options Error during ajp_connection_tcp_get_message() - * Failure after reading the AJP packet header - * JK_STATUS_ERROR mostly JK_TRUE ajp_process_callback() returns JK_STATUS_ERROR - * Recoverable, if callback didn't return with a JK_HAS_RESPONSE before. - * JK_HAS_RESPONSE: parts of the post buffer are consumed. - * JK_STATUS_FATAL_ERROR mostly JK_TRUE ajp_process_callback() returns JK_STATUS_FATAL_ERROR - * Recoverable, if callback didn't return with a JK_HAS_RESPONSE before. - * JK_HAS_RESPONSE: parts of the post buffer are consumed. - * JK_FATAL_ERROR ? ajp_process_callback() returns JK_AJP13_ERROR - * JK_AJP13_ERROR: protocol error, or JK_INTERNAL_ERROR: chunk size to large - * JK_CLIENT_RD_ERROR ? ajp_process_callback() returns JK_CLIENT_RD_ERROR - * JK_CLIENT_RD_ERROR: could not read post from client. - * JK_CLIENT_WR_ERROR ? ajp_process_callback() returns JK_CLIENT_WR_ERROR - * JK_CLIENT_WR_ERROR: could not write back result to client - * JK_TRUE ? ajp_process_callback() returns JK_AJP13_END_RESPONSE - * JK_FALSE ? Other unhandled cases (unknown return codes) - */ -static int ajp_get_reply(jk_endpoint_t *e, - jk_ws_service_t *s, - jk_logger_t *l, - ajp_endpoint_t * p, ajp_operation_t * op) -{ - /* Don't get header from tomcat yet */ - int headeratclient = JK_FALSE; - - JK_TRACE_ENTER(l); - - p->last_errno = 0; - /* Start read all reply message */ - while (1) { - int rc = 0; - /* Allow to overwrite reply_timeout on a per URL basis via service struct */ - int reply_timeout = s->extension.reply_timeout; - if (reply_timeout < 0) - reply_timeout = p->worker->reply_timeout; - /* If we set a reply timeout, check if something is available */ - if (reply_timeout > 0) { - if (jk_is_input_event(p->sd, reply_timeout, l) == - JK_FALSE) { - p->last_errno = errno; - jk_log(l, JK_LOG_ERROR, - "(%s) Timeout with waiting reply from tomcat. " - "Tomcat is down, stopped or network problems (errno=%d)", - p->worker->name, p->last_errno); - /* We can't trust this connection any more. */ - ajp_abort_endpoint(p, JK_TRUE, l); - if (headeratclient == JK_FALSE) { - if (p->worker->recovery_opts & RECOVER_ABORT_IF_TCGETREQUEST) - op->recoverable = JK_FALSE; - /* - * We revert back to recoverable, if recovery_opts allow it for GET or HEAD - */ - if (op->recoverable == JK_FALSE) { - if (p->worker->recovery_opts & RECOVER_ALWAYS_HTTP_HEAD) { - if (!strcmp(s->method, "HEAD")) - op->recoverable = JK_TRUE; - } - else if (p->worker->recovery_opts & RECOVER_ALWAYS_HTTP_GET) { - if (!strcmp(s->method, "GET")) - op->recoverable = JK_TRUE; - } - } - } - else { - if (p->worker->recovery_opts & RECOVER_ABORT_IF_TCSENDHEADER) - op->recoverable = JK_FALSE; - } - - JK_TRACE_EXIT(l); - return JK_REPLY_TIMEOUT; - } - } - - if ((rc = ajp_connection_tcp_get_message(p, op->reply, l)) != JK_TRUE) { - if (headeratclient == JK_FALSE) { - jk_log(l, JK_LOG_ERROR, - "(%s) Tomcat is down or refused connection. " - "No response has been sent to the client (yet)", - p->worker->name); - /* - * communication with tomcat has been interrupted BEFORE - * headers have been sent to the client. - */ - - /* - * We mark it unrecoverable if recovery_opts set to RECOVER_ABORT_IF_TCGETREQUEST - */ - if (p->worker->recovery_opts & RECOVER_ABORT_IF_TCGETREQUEST) - op->recoverable = JK_FALSE; - /* - * We revert back to recoverable, if recovery_opts allow it for GET or HEAD - */ - if (op->recoverable == JK_FALSE) { - if (p->worker->recovery_opts & RECOVER_ALWAYS_HTTP_HEAD) { - if (!strcmp(s->method, "HEAD")) - op->recoverable = JK_TRUE; - } - else if (p->worker->recovery_opts & RECOVER_ALWAYS_HTTP_GET) { - if (!strcmp(s->method, "GET")) - op->recoverable = JK_TRUE; - } - } - - } - else { - jk_log(l, JK_LOG_ERROR, - "(%s) Tomcat is down or network problems. " - "Part of the response has already been sent to the client", - p->worker->name); - - /* communication with tomcat has been interrupted AFTER - * headers have been sent to the client. - * headers (and maybe parts of the body) have already been - * sent, therefore the response is "complete" in a sense - * that nobody should append any data, especially no 500 error - * page of the webserver! - */ - - /* - * We mark it unrecoverable if recovery_opts set to RECOVER_ABORT_IF_TCSENDHEADER - */ - if (p->worker->recovery_opts & RECOVER_ABORT_IF_TCSENDHEADER) - op->recoverable = JK_FALSE; - - } - - JK_TRACE_EXIT(l); - return rc; - } - - rc = ajp_process_callback(op->reply, op->post, p, s, l); - p->last_op = rc; - /* no more data to be sent, fine we have finish here */ - if (JK_AJP13_END_RESPONSE == rc) { - JK_TRACE_EXIT(l); - return JK_TRUE; - } - else if (JK_AJP13_SEND_HEADERS == rc) { - if (headeratclient == JK_FALSE) - headeratclient = JK_TRUE; - else { - /* Backend send headers twice? - * This is protocol violation - */ - jk_log(l, JK_LOG_ERROR, - "(%s) Tomcat already send headers", - p->worker->name); - op->recoverable = JK_FALSE; - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - else if (JK_STATUS_ERROR == rc || JK_STATUS_FATAL_ERROR == rc) { - jk_log(l, JK_LOG_INFO, - "(%s) request failed%s, " - "because of response status %d, ", - p->worker->name, - rc == JK_STATUS_FATAL_ERROR ? "" : " (soft)", - s->http_response_status); - JK_TRACE_EXIT(l); - return rc; - } - else if (JK_AJP13_HAS_RESPONSE == rc) { - /* - * in upload-mode there is no second chance since - * we may have already sent part of the uploaded data - * to Tomcat. - * In this case if Tomcat connection is broken we must - * abort request and indicate error. - * A possible work-around could be to store the uploaded - * data to file and replay for it - */ - op->recoverable = JK_FALSE; - rc = ajp_connection_tcp_send_message(p, op->post, l); - if (rc < 0) { - jk_log(l, JK_LOG_ERROR, - "(%s) Tomcat is down or network problems", - p->worker->name); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - else if (JK_AJP13_ERROR == rc) { - /* - * Tomcat has send invalid AJP message. - * Loadbalancer if present will decide if - * failover is possible. - */ - JK_TRACE_EXIT(l); - return JK_FATAL_ERROR; - } - else if (JK_CLIENT_RD_ERROR == rc) { - /* - * Client has stop sending to us, so get out. - * We assume this isn't our fault, so just a normal exit. - */ - JK_TRACE_EXIT(l); - return JK_CLIENT_RD_ERROR; - } - else if (JK_CLIENT_WR_ERROR == rc) { - /* - * Client has stop receiving to us, so get out. - * We assume this isn't our fault, so just a normal exit. - */ - JK_TRACE_EXIT(l); - return JK_CLIENT_WR_ERROR; - } - else if (JK_INTERNAL_ERROR == rc) { - /* - * Internal error, like memory allocation or invalid packet lengths. - */ - JK_TRACE_EXIT(l); - return JK_FATAL_ERROR; - } - else if (JK_AJP13_NO_RESPONSE == rc) { - /* - * This is fine, loop again, more data to send. - */ - continue; - } - else if (rc < 0) { - op->recoverable = JK_FALSE; - jk_log(l, JK_LOG_ERROR, - "(%s) Callback returns with unknown value %d", - p->worker->name, rc); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - /* XXX: Not reached? */ - JK_TRACE_EXIT(l); - return JK_FALSE; -} - -static void ajp_update_stats(jk_endpoint_t *e, ajp_worker_t *aw, int rc, jk_logger_t *l) -{ - aw->s->readed += e->rd; - aw->s->transferred += e->wr; - if (aw->s->busy) - aw->s->busy--; - if (rc == JK_TRUE) { - aw->s->state = JK_AJP_STATE_OK; - } - else if (rc == JK_CLIENT_ERROR) { - aw->s->state = JK_AJP_STATE_OK; - aw->s->client_errors++; - } - else { - aw->s->state = JK_AJP_STATE_ERROR; - aw->s->errors++; - aw->s->error_time = time(NULL); - } -} - -/* - * service is now splitted in ajp_send_request and ajp_get_reply - * much more easier to do errors recovery - * - * We serve here the request, using AJP13/AJP14 (e->proto) - * - * Return values of service() method for ajp13/ajp14 worker: - * return value is_error e->recoverable reason - * JK_FALSE JK_HTTP_SERVER_ERROR TRUE Invalid Parameters (null values) - * JK_SERVER_ERROR JK_HTTP_SERVER_ERROR TRUE Error during initializing empty request, response or post body objects - * JK_CLIENT_ERROR JK_HTTP_REQUEST_TOO_LARGE JK_TRUE Request doesn't fit into buffer (error during ajp_marshal_into_msgb()) - * JK_CLIENT_ERROR JK_HTTP_BAD_REQUEST JK_FALSE Error during reading parts of POST body from client - * JK_FATAL_ERROR JK_HTTP_SERVER_ERROR JK_FALSE If ajp_send_request() returns JK_FATAL_ERROR and !op->recoverable. - * JK_FATAL_ERROR JK_HTTP_SERVER_ERROR JK_FALSE If ajp_send_request() returns JK_TRUE but !op->recoverable. - * This should never happen. - * JK_CLIENT_ERROR JK_HTTP_BAD_REQUEST ? ajp_get_reply() returns JK_CLIENT_RD_ERROR - * JK_CLIENT_ERROR JK_HTTP_OK ? ajp_get_reply() returns JK_CLIENT_WR_ERROR - * JK_FATAL_ERROR JK_HTTP_SERVER_ERROR JK_TRUE ajp_get_reply() returns JK_FATAL_ERROR - * JK_FATAL_ERROR: protocol error or internal error - * JK_FATAL_ERROR JK_HTTP_SERVER_ERROR JK_FALSE ajp_get_reply() returns JK_FATAL_ERROR - * JK_FATAL_ERROR: protocol error or internal error - * JK_STATUS_ERROR JK_HTTP_SERVER_BUSY JK_TRUE ajp_get_reply() returns JK_STATUS_ERROR - * Only if op->recoverable and no more ajp13/ajp14 direct retries - * JK_STATUS_ERROR JK_HTTP_SERVER_BUSY JK_FALSE ajp_get_reply() returns JK_STATUS_ERROR - * Only if !op->recoverable - * JK_STATUS_FATAL_ERROR JK_HTTP_SERVER_BUSY JK_TRUE ajp_get_reply() returns JK_STATUS_ERROR - * Only if op->recoverable and no more ajp13/ajp14 direct retries - * JK_STATUS_FATAL_ERROR JK_HTTP_SERVER_BUSY JK_FALSE ajp_get_reply() returns JK_STATUS_FATAL_ERROR - * Only if !op->recoverable - * JK_REPLY_TIMEOUT JK_HTTP_GATEWAY_TIME_OUT JK_TRUE ajp_get_reply() returns JK_REPLY_TIMEOUT - * JK_AJP_PROTOCOL_ERROR JK_HTTP_GATEWAY_TIME_OUT ? ajp_get_reply() returns JK_AJP_PROTOCOL_ERROR - * ??? JK_FATAL_ERROR JK_HTTP_GATEWAY_TIME_OUT JK_FALSE ajp_get_reply() returns something else - * Only if !op->recoverable - * ??? JK_FALSE JK_HTTP_SERVER_BUSY JK_TRUE ajp_get_reply() returns JK_FALSE - * Only if op->recoverable and no more ajp13/ajp14 direct retries - * JK_TRUE JK_HTTP_OK ? OK - */ -static int JK_METHOD ajp_service(jk_endpoint_t *e, - jk_ws_service_t *s, - jk_logger_t *l, int *is_error) -{ - int i; - int err = JK_TRUE; - ajp_operation_t oper; - ajp_operation_t *op = &oper; - ajp_endpoint_t *p; - ajp_worker_t *aw; - int log_error; - int rc = JK_UNSET; - char *msg = ""; - int retry_interval; - - JK_TRACE_ENTER(l); - - if (!e || !e->endpoint_private || !s || !is_error) { - JK_LOG_NULL_PARAMS(l); - if (is_error) - *is_error = JK_HTTP_SERVER_ERROR; - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - p = e->endpoint_private; - aw = p->worker; - - if (aw->sequence != aw->s->h.sequence) - jk_ajp_pull(aw, JK_FALSE, l); - - aw->s->used++; - - /* Set returned error to SERVER ERROR */ - *is_error = JK_HTTP_SERVER_ERROR; - - op->request = jk_b_new(&(p->pool)); - if (!op->request) { - jk_log(l, JK_LOG_ERROR, - "Failed allocating AJP message"); - JK_TRACE_EXIT(l); - return JK_SERVER_ERROR; - } - if (jk_b_set_buffer_size(op->request, aw->max_packet_size)) { - jk_log(l, JK_LOG_ERROR, - "Failed allocating AJP message buffer"); - JK_TRACE_EXIT(l); - return JK_SERVER_ERROR; - } - jk_b_reset(op->request); - - op->reply = jk_b_new(&(p->pool)); - if (!op->reply) { - jk_log(l, JK_LOG_ERROR, - "Failed allocating AJP message"); - JK_TRACE_EXIT(l); - return JK_SERVER_ERROR; - } - if (jk_b_set_buffer_size(op->reply, aw->max_packet_size)) { - jk_log(l, JK_LOG_ERROR, - "Failed allocating AJP message buffer"); - JK_TRACE_EXIT(l); - return JK_SERVER_ERROR; - } - - op->post = jk_b_new(&(p->pool)); - if (!op->post) { - jk_log(l, JK_LOG_ERROR, - "Failed allocating AJP message"); - JK_TRACE_EXIT(l); - return JK_SERVER_ERROR; - } - if (jk_b_set_buffer_size(op->post, aw->max_packet_size)) { - jk_log(l, JK_LOG_ERROR, - "Failed allocating AJP message buffer"); - JK_TRACE_EXIT(l); - return JK_SERVER_ERROR; - } - jk_b_reset(op->post); - - /* Set returned error to OK */ - *is_error = JK_HTTP_OK; - - op->recoverable = JK_TRUE; - op->uploadfd = -1; /* not yet used, later ;) */ - - p->left_bytes_to_send = s->content_length; - p->reuse = JK_FALSE; - p->hard_close = JK_FALSE; - - s->secret = aw->secret; - - /* - * We get here initial request (in op->request) - */ - if (!ajp_marshal_into_msgb(op->request, s, l, p)) { - *is_error = JK_HTTP_REQUEST_TOO_LARGE; - jk_log(l, JK_LOG_INFO, - "Creating AJP message failed, " - "without recovery"); - aw->s->client_errors++; - JK_TRACE_EXIT(l); - return JK_CLIENT_ERROR; - } - - if (JK_IS_DEBUG_LEVEL(l)) { - jk_log(l, JK_LOG_DEBUG, "processing %s with %d retries", - aw->name, aw->retries); - } - aw->s->busy++; - if (aw->s->state == JK_AJP_STATE_ERROR) - aw->s->state = JK_AJP_STATE_PROBE; - if (aw->s->busy > aw->s->max_busy) - aw->s->max_busy = aw->s->busy; - retry_interval = p->worker->retry_interval; - for (i = 0; i < aw->retries; i++) { - /* Reset reply message buffer for each retry */ - jk_b_reset(op->reply); - - /* - * ajp_send_request() already locally handles - * reconnecting and broken connection detection. - * So if we already failed in it, wait a bit before - * retrying the same backend. - */ - if (i > 0 && retry_interval >= 0) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "retry %d, sleeping for %d ms before retrying", - i, retry_interval); - jk_sleep(retry_interval); - /* Pull shared memory if something changed during sleep */ - if (aw->sequence != aw->s->h.sequence) - jk_ajp_pull(aw, JK_FALSE, l); - } - /* - * We're using op->request which hold initial request - * if Tomcat is stopped or restarted, we will pass op->request - * to next valid tomcat. - */ - log_error = JK_TRUE; - rc = JK_UNSET; - msg = ""; - err = ajp_send_request(e, s, l, p, op); - e->recoverable = op->recoverable; - if (err == JK_CLIENT_RD_ERROR) { - *is_error = JK_HTTP_BAD_REQUEST; - msg = "because of client read error"; - aw->s->client_errors++; - rc = JK_CLIENT_ERROR; - log_error = JK_FALSE; - e->recoverable = JK_FALSE; - /* Ajp message set reuse to TRUE in END_REQUEST message - * However due to client bad request if the recovery - * RECOVER_ABORT_IF_CLIENTERROR is set the physical connection - * will be closed and application in Tomcat can catch that - * generated exception, knowing the client aborted the - * connection. This AJP protocol limitation, where we - * should actually send some packet informing the backend - * that client broke the connection in a middle of - * request/response cycle. - */ - if (aw->recovery_opts & RECOVER_ABORT_IF_CLIENTERROR) { - /* Mark the endpoint for shutdown */ - p->reuse = JK_FALSE; - p->hard_close = JK_TRUE; - } - } - else if (err == JK_FATAL_ERROR) { - *is_error = JK_HTTP_SERVER_BUSY; - msg = "because of error during request sending"; - rc = err; - if (!op->recoverable) { - *is_error = JK_HTTP_SERVER_ERROR; - msg = "because of protocol error during request sending"; - } - } - else if (err == JK_TRUE && op->recoverable) { - /* Up to there we can recover */ - - err = ajp_get_reply(e, s, l, p, op); - e->recoverable = op->recoverable; - if (err == JK_TRUE) { - *is_error = JK_HTTP_OK; - /* Done with the request */ - ajp_update_stats(e, aw, JK_TRUE, l); - JK_TRACE_EXIT(l); - return JK_TRUE; - } - - if (err == JK_CLIENT_RD_ERROR) { - *is_error = JK_HTTP_BAD_REQUEST; - msg = "because of client read error"; - aw->s->client_errors++; - rc = JK_CLIENT_ERROR; - log_error = JK_FALSE; - e->recoverable = JK_FALSE; - op->recoverable = JK_FALSE; - if (aw->recovery_opts & RECOVER_ABORT_IF_CLIENTERROR) { - /* Mark the endpoint for shutdown */ - p->reuse = JK_FALSE; - p->hard_close = JK_TRUE; - } - } - else if (err == JK_CLIENT_WR_ERROR) { - /* XXX: Is this correct to log this as 200? */ - *is_error = JK_HTTP_OK; - msg = "because of client write error"; - aw->s->client_errors++; - rc = JK_CLIENT_ERROR; - log_error = JK_FALSE; - e->recoverable = JK_FALSE; - op->recoverable = JK_FALSE; - if (aw->recovery_opts & RECOVER_ABORT_IF_CLIENTERROR) { - /* Mark the endpoint for shutdown */ - p->reuse = JK_FALSE; - p->hard_close = JK_TRUE; - } - } - else if (err == JK_FATAL_ERROR) { - *is_error = JK_HTTP_SERVER_ERROR; - msg = "because of server error"; - rc = err; - } - else if (err == JK_REPLY_TIMEOUT) { - *is_error = JK_HTTP_GATEWAY_TIME_OUT; - msg = "because of reply timeout"; - aw->s->reply_timeouts++; - rc = err; - } - else if (err == JK_STATUS_ERROR || err == JK_STATUS_FATAL_ERROR) { - *is_error = JK_HTTP_SERVER_BUSY; - msg = "because of response status"; - rc = err; - } - else if (err == JK_AJP_PROTOCOL_ERROR) { - *is_error = JK_HTTP_BAD_GATEWAY; - msg = "because of protocol error"; - rc = err; - } - /* This should only be the cases err == JK_FALSE */ - else { - /* if we can't get reply, check if unrecoverable flag was set - * if is_recoverable_error is cleared, we have started - * receiving upload data and we must consider that - * operation is no more recoverable - */ - *is_error = JK_HTTP_BAD_GATEWAY; - msg = ""; - rc = JK_FALSE; - } - } - else { - /* XXX: this should never happen: - * ajp_send_request() never returns JK_TRUE if !op->recoverable. - * and all other return values have already been handled. - */ - e->recoverable = JK_FALSE; - *is_error = JK_HTTP_SERVER_ERROR; - msg = "because of an unknown reason"; - rc = JK_FATAL_ERROR; - jk_log(l, JK_LOG_ERROR, - "(%s) unexpected condition err=%d recoverable=%d", - aw->name, err, op->recoverable); - } - if (!op->recoverable && log_error == JK_TRUE) { - jk_log(l, JK_LOG_ERROR, - "(%s) sending request to tomcat failed (unrecoverable), " - "%s " - "(attempt=%d)", - aw->name, msg, i + 1); - } - else { - jk_log(l, JK_LOG_INFO, - "(%s) sending request to tomcat failed (%srecoverable), " - "%s " - "(attempt=%d)", - aw->name, - op->recoverable ? "" : "un", - msg, i + 1); - } - if (!op->recoverable) { - ajp_update_stats(e, aw, rc, l); - JK_TRACE_EXIT(l); - return rc; - } - /* Get another connection from the pool and try again. - * Note: All sockets are probably closed already. - */ - ajp_next_connection(p, l); - } - /* Log the error only once per failed request. */ - jk_log(l, JK_LOG_ERROR, - "(%s) connecting to tomcat failed.", - aw->name); - - ajp_update_stats(e, aw, rc, l); - JK_TRACE_EXIT(l); - return rc; -} - -/* - * Validate the worker (ajp13/ajp14) - */ - -int ajp_validate(jk_worker_t *pThis, - jk_map_t *props, - jk_worker_env_t *we, jk_logger_t *l, int proto) -{ - int port; - const char *host; - - JK_TRACE_ENTER(l); - - if (proto == AJP13_PROTO) { - port = AJP13_DEF_PORT; - host = AJP13_DEF_HOST; - } - else if (proto == AJP14_PROTO) { - port = AJP14_DEF_PORT; - host = AJP14_DEF_HOST; - } - else { - jk_log(l, JK_LOG_ERROR, - "unknown protocol %d", proto); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (pThis && pThis->worker_private) { - ajp_worker_t *p = pThis->worker_private; - p->port = jk_get_worker_port(props, p->name, port); - if (!host) { - host = "undefined"; - } - strncpy(p->host, jk_get_worker_host(props, p->name, host), JK_SHM_STR_SIZ); - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "worker %s contact is '%s:%d'", - p->name, p->host, p->port); - /* Copy the contact to shm */ - strncpy(p->s->host, p->host, JK_SHM_STR_SIZ); - p->s->port = p->port; - p->s->addr_sequence = p->addr_sequence = 0; - /* Resolve if port > 0. - */ - if (p->port > 0) { - if (jk_resolve(p->host, p->port, &p->worker_inet_addr, we->pool, l)) { - JK_TRACE_EXIT(l); - return JK_TRUE; - } - jk_log(l, JK_LOG_ERROR, - "worker %s can't resolve tomcat address %s", - p->name, p->host); - p->s->port = p->port = 0; - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "worker %s contact is disabled", - p->name); - JK_TRACE_EXIT(l); - return JK_TRUE; - } - else { - p->s->port = p->port = 0; - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "worker %s contact is disabled", - p->name); - JK_TRACE_EXIT(l); - return JK_TRUE; - } - } - else { - JK_LOG_NULL_PARAMS(l); - } - - JK_TRACE_EXIT(l); - return JK_FALSE; -} - -static int ajp_create_endpoint_cache(ajp_worker_t *p, int proto, jk_logger_t *l) -{ - unsigned int i; - time_t now = time(NULL); - - JK_TRACE_ENTER(l); - - p->ep_cache = (ajp_endpoint_t **)calloc(1, sizeof(ajp_endpoint_t *) * - p->ep_cache_sz); - if (!p->ep_cache) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "setting connection pool size to %u with min %u and acquire timeout %d", - p->ep_cache_sz, p->ep_mincache_sz, p->cache_acquire_timeout); - for (i = 0; i < p->ep_cache_sz; i++) { - p->ep_cache[i] = (ajp_endpoint_t *)calloc(1, sizeof(ajp_endpoint_t)); - if (!p->ep_cache[i]) { - jk_log(l, JK_LOG_ERROR, - "allocating endpoint slot %d (errno=%d)", - i, errno); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - p->ep_cache[i]->sd = JK_INVALID_SOCKET; - p->ep_cache[i]->reuse = JK_FALSE; - p->ep_cache[i]->hard_close = JK_FALSE; - p->ep_cache[i]->last_access = now; - jk_open_pool(&(p->ep_cache[i]->pool), p->ep_cache[i]->buf, - sizeof(p->ep_cache[i]->buf)); - p->ep_cache[i]->worker = p; - p->ep_cache[i]->endpoint.endpoint_private = p->ep_cache[i]; - p->ep_cache[i]->proto = proto; - p->ep_cache[i]->endpoint.service = ajp_service; - p->ep_cache[i]->endpoint.done = ajp_done; - p->ep_cache[i]->last_op = JK_AJP13_END_RESPONSE; - p->ep_cache[i]->addr_sequence = 0; - } - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -int ajp_init(jk_worker_t *pThis, - jk_map_t *props, jk_worker_env_t *we, jk_logger_t *l, int proto) -{ - int rc = JK_FALSE; - int cache; - /* - * start the connection cache - */ - JK_TRACE_ENTER(l); - - cache = jk_get_worker_def_cache_size(proto); - - if (pThis && pThis->worker_private) { - ajp_worker_t *p = pThis->worker_private; - p->worker.we = we; - p->ep_cache_sz = jk_get_worker_cache_size(props, p->name, cache); - p->ep_mincache_sz = jk_get_worker_cache_size_min(props, p->name, - (p->ep_cache_sz+1) / 2); - p->socket_timeout = - jk_get_worker_socket_timeout(props, p->name, AJP_DEF_SOCKET_TIMEOUT); - - p->socket_connect_timeout = - jk_get_worker_socket_connect_timeout(props, p->name, - p->socket_timeout * 1000); - - p->keepalive = - jk_get_worker_socket_keepalive(props, p->name, JK_FALSE); - - p->cache_timeout = - jk_get_worker_cache_timeout(props, p->name, - AJP_DEF_CACHE_TIMEOUT); - - p->ping_timeout = - jk_get_worker_ping_timeout(props, p->name, - AJP_DEF_PING_TIMEOUT); - p->ping_mode = - jk_get_worker_ping_mode(props, p->name, - AJP_CPING_NONE); - - p->connect_timeout = - jk_get_worker_connect_timeout(props, p->name, - AJP_DEF_CONNECT_TIMEOUT); - - p->prepost_timeout = - jk_get_worker_prepost_timeout(props, p->name, - AJP_DEF_PREPOST_TIMEOUT); - - if ((p->ping_mode & AJP_CPING_CONNECT) && - p->connect_timeout == AJP_DEF_CONNECT_TIMEOUT) - p->connect_timeout = p->ping_timeout; - - if ((p->ping_mode & AJP_CPING_PREPOST) && - p->prepost_timeout == AJP_DEF_PREPOST_TIMEOUT) - p->prepost_timeout = p->ping_timeout; - - p->conn_ping_interval = - jk_get_worker_conn_ping_interval(props, p->name, 0); - if ((p->ping_mode & AJP_CPING_INTERVAL) && - p->conn_ping_interval == 0) { - /* XXX: Ping timeout is in miliseconds - * and ping_interval is in seconds. - * Use 10 times larger value for ping interval - * (ping_timeout / 1000) * 10 - */ - p->conn_ping_interval = p->ping_timeout / 100; - } - p->reply_timeout = - jk_get_worker_reply_timeout(props, p->name, - AJP_DEF_REPLY_TIMEOUT); - - p->recovery_opts = - jk_get_worker_recovery_opts(props, p->name, - AJP_DEF_RECOVERY_OPTS); - - p->retries = - jk_get_worker_retries(props, p->name, - JK_RETRIES); - - p->max_packet_size = - jk_get_max_packet_size(props, p->name); - - p->socket_buf = - jk_get_worker_socket_buffer(props, p->name, p->max_packet_size); - - p->retry_interval = - jk_get_worker_retry_interval(props, p->name, - JK_SLEEP_DEF); - p->cache_acquire_timeout = jk_get_worker_cache_acquire_timeout(props, - p->name, p->retries * p->retry_interval); - p->http_status_fail_num = jk_get_worker_fail_on_status(props, p->name, - &p->http_status_fail[0], - JK_MAX_HTTP_STATUS_FAILS); - - if (p->retries < 1) { - jk_log(l, JK_LOG_INFO, - "number of retries must be greater then 1. Setting to default=%d", - JK_RETRIES); - p->retries = JK_RETRIES; - } - - p->maintain_time = jk_get_worker_maintain_time(props); - if(p->maintain_time < 0) - p->maintain_time = 0; - p->s->last_maintain_time = time(NULL); - p->s->last_reset = p->s->last_maintain_time; - - if (JK_IS_DEBUG_LEVEL(l)) { - - jk_log(l, JK_LOG_DEBUG, - "setting endpoint options:", - p->keepalive); - jk_log(l, JK_LOG_DEBUG, - "keepalive: %d", - p->keepalive); - - jk_log(l, JK_LOG_DEBUG, - "socket timeout: %d", - p->socket_timeout); - - jk_log(l, JK_LOG_DEBUG, - "socket connect timeout: %d", - p->socket_connect_timeout); - - jk_log(l, JK_LOG_DEBUG, - "buffer size: %d", - p->socket_buf); - - jk_log(l, JK_LOG_DEBUG, - "pool timeout: %d", - p->cache_timeout); - - jk_log(l, JK_LOG_DEBUG, - "ping timeout: %d", - p->ping_timeout); - - jk_log(l, JK_LOG_DEBUG, - "connect timeout: %d", - p->connect_timeout); - - jk_log(l, JK_LOG_DEBUG, - "reply timeout: %d", - p->reply_timeout); - - jk_log(l, JK_LOG_DEBUG, - "prepost timeout: %d", - p->prepost_timeout); - - jk_log(l, JK_LOG_DEBUG, - "recovery options: %d", - p->recovery_opts); - - jk_log(l, JK_LOG_DEBUG, - "retries: %d", - p->retries); - - jk_log(l, JK_LOG_DEBUG, - "max packet size: %d", - p->max_packet_size); - - jk_log(l, JK_LOG_DEBUG, - "retry interval: %d", - p->retry_interval); - } - /* - * Need to initialize secret here since we could return from inside - * of the following loop - */ - - p->secret = jk_get_worker_secret(props, p->name); - /* Initialize cache slots */ - JK_INIT_CS(&(p->cs), rc); - if (!rc) { - jk_log(l, JK_LOG_ERROR, - "creating thread lock (errno=%d)", - errno); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - if (!ajp_create_endpoint_cache(p, proto, l)) { - jk_log(l, JK_LOG_ERROR, - "allocating connection pool of size %u", - p->ep_cache_sz); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - rc = JK_TRUE; - } - else { - JK_LOG_NULL_PARAMS(l); - } - - JK_TRACE_EXIT(l); - return rc; -} - -int JK_METHOD ajp_worker_factory(jk_worker_t **w, - const char *name, jk_logger_t *l) -{ - ajp_worker_t *aw; - - JK_TRACE_ENTER(l); - if (name == NULL || w == NULL) { - JK_LOG_NULL_PARAMS(l); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - aw = (ajp_worker_t *) calloc(1, sizeof(ajp_worker_t)); - if (!aw) { - jk_log(l, JK_LOG_ERROR, - "malloc of private_data failed"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - jk_open_pool(&aw->p, - aw->buf, - sizeof(jk_pool_atom_t) * TINY_POOL_SIZE); - - strncpy(aw->name, name, JK_SHM_STR_SIZ); - aw->login = NULL; - - aw->ep_cache_sz = 0; - aw->ep_cache = NULL; - aw->connect_retry_attempts = AJP_DEF_RETRY_ATTEMPTS; - aw->worker.worker_private = aw; - - aw->worker.maintain = ajp_maintain; - - aw->logon = NULL; - - *w = &aw->worker; - - aw->s = jk_shm_alloc_ajp_worker(&aw->p); - if (!aw->s) { - jk_close_pool(&aw->p); - free(aw); - jk_log(l, JK_LOG_ERROR, - "allocating ajp worker record from shared memory"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -int ajp_destroy(jk_worker_t **pThis, jk_logger_t *l, int proto) -{ - JK_TRACE_ENTER(l); - - if (pThis && *pThis && (*pThis)->worker_private) { - unsigned int i; - ajp_worker_t *aw = (*pThis)->worker_private; - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "up to %u endpoints to close", - aw->ep_cache_sz); - - for (i = 0; i < aw->ep_cache_sz; i++) { - if (aw->ep_cache[i]) - ajp_close_endpoint(aw->ep_cache[i], l); - } - free(aw->ep_cache); - JK_DELETE_CS(&(aw->cs), i); - - if (aw->login) { - /* take care of removing previously allocated data */ - if (aw->login->servlet_engine_name) - free(aw->login->servlet_engine_name); - - free(aw->login); - aw->login = NULL; - } - - jk_close_pool(&aw->p); - free(aw); - JK_TRACE_EXIT(l); - return JK_TRUE; - } - - JK_LOG_NULL_PARAMS(l); - JK_TRACE_EXIT(l); - return JK_FALSE; -} - -int JK_METHOD ajp_done(jk_endpoint_t **e, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - - if (e && *e && (*e)->endpoint_private) { - ajp_endpoint_t *p = (*e)->endpoint_private; - int rc; - ajp_worker_t *w = p->worker; - - /* set last_access only if needed */ - if (w->cache_timeout > 0) - p->last_access = time(NULL); - if (w->s->addr_sequence != p->addr_sequence) { - p->reuse = JK_FALSE; - p->addr_sequence = w->s->addr_sequence; - } - ajp_reset_endpoint(p, l); - *e = NULL; - JK_ENTER_CS(&w->cs, rc); - if (rc) { - int i; - - for (i = w->ep_cache_sz - 1; i >= 0; i--) { - if (w->ep_cache[i] == NULL) { - w->ep_cache[i] = p; - break; - } - } - JK_LEAVE_CS(&w->cs, rc); - - if (i >= 0) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "recycling connection pool slot=%u for worker %s", - i, p->worker->name); - JK_TRACE_EXIT(l); - return JK_TRUE; - } - /* This should never hapen because - * there is always free empty cache slot - */ - jk_log(l, JK_LOG_ERROR, - "could not find empty connection pool slot from %u for worker %s", - w->ep_cache_sz, w->name); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - jk_log(l, JK_LOG_ERROR, - "locking thread (errno=%d)", errno); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - JK_LOG_NULL_PARAMS(l); - JK_TRACE_EXIT(l); - return JK_FALSE; -} - -int ajp_get_endpoint(jk_worker_t *pThis, - jk_endpoint_t **je, jk_logger_t *l, int proto) -{ - JK_TRACE_ENTER(l); - - if (pThis && pThis->worker_private && je) { - ajp_worker_t *aw = pThis->worker_private; - ajp_endpoint_t *ae = NULL; - int rc; - int retry = 0; - - *je = NULL; - /* Loop until cache_acquire_timeout interval elapses */ - while ((retry * JK_SLEEP_DEF) < aw->cache_acquire_timeout) { - - JK_ENTER_CS(&aw->cs, rc); - if (rc) { - unsigned int slot; - /* Try to find connected socket cache entry */ - for (slot = 0; slot < aw->ep_cache_sz; slot++) { - if (aw->ep_cache[slot] && - IS_VALID_SOCKET(aw->ep_cache[slot]->sd)) { - ae = aw->ep_cache[slot]; - if (ae->reuse) { - aw->ep_cache[slot] = NULL; - break; - } - else { - /* XXX: We shouldn't have non reusable - * opened socket in the cache - */ - ajp_reset_endpoint(ae, l); - ae = NULL; - jk_log(l, JK_LOG_WARNING, - "closing non reusable pool slot=%d", slot); - } - } - } - if (!ae) { - /* No connected cache entry found. - * Use the first free one. - */ - for (slot = 0; slot < aw->ep_cache_sz; slot++) { - if (aw->ep_cache[slot]) { - ae = aw->ep_cache[slot]; - aw->ep_cache[slot] = NULL; - break; - } - } - } - JK_LEAVE_CS(&aw->cs, rc); - if (ae) { - if (aw->cache_timeout > 0) - ae->last_access = time(NULL); - *je = &ae->endpoint; - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "acquired connection pool slot=%u after %d retries", - slot, retry); - JK_TRACE_EXIT(l); - return JK_TRUE; - } - else { - retry++; - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "could not get free endpoint for worker %s" - " (retry %d, sleeping for %d ms)", - aw->name, retry, JK_SLEEP_DEF); - jk_sleep(JK_SLEEP_DEF); - } - } - else { - jk_log(l, JK_LOG_ERROR, - "locking thread (errno=%d)", errno); - JK_TRACE_EXIT(l); - return JK_FALSE; - - } - } - jk_log(l, JK_LOG_WARNING, - "Unable to get the free endpoint for worker %s from %u slots", - aw->name, aw->ep_cache_sz); - } - else { - JK_LOG_NULL_PARAMS(l); - } - - JK_TRACE_EXIT(l); - return JK_FALSE; -} - -int JK_METHOD ajp_maintain(jk_worker_t *pThis, time_t mstarted, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - - if (pThis && pThis->worker_private) { - ajp_worker_t *aw = pThis->worker_private; - time_t now = mstarted; - int rc; - long delta; - - jk_shm_lock(); - - /* Now we check for global maintenance (once for all processes). - * Checking workers for idleness. - * Therefore we globally sync and we use a global timestamp. - * Since it's possible that we come here a few milliseconds - * before the interval has passed, we allow a little tolerance. - */ - delta = (long)difftime(mstarted, aw->s->last_maintain_time) + JK_AJP_MAINTAIN_TOLERANCE; - if (delta >= aw->maintain_time) { - aw->s->last_maintain_time = mstarted; - if (aw->s->state == JK_AJP_STATE_OK && - aw->s->used == aw->s->used_snapshot) - aw->s->state = JK_AJP_STATE_IDLE; - aw->s->used_snapshot = aw->s->used; - } - - jk_shm_unlock(); - - /* Do connection pool maintenance only if timeouts or keepalives are set */ - if (aw->cache_timeout <= 0 && - aw->conn_ping_interval <= 0) { - /* Nothing to do. */ - JK_TRACE_EXIT(l); - return JK_TRUE; - } - - JK_ENTER_CS(&aw->cs, rc); - if (rc) { - unsigned int n = 0, k = 0, cnt = 0; - int i; - unsigned int m, m_count = 0; - jk_sock_t *m_sock; - /* Count open slots */ - for (i = (int)aw->ep_cache_sz - 1; i >= 0; i--) { - if (aw->ep_cache[i] && IS_VALID_SOCKET(aw->ep_cache[i]->sd)) - cnt++; - } - m_sock = (jk_sock_t *)malloc((cnt + 1) * sizeof(jk_sock_t)); - /* Handle worker cache timeouts */ - if (aw->cache_timeout > 0) { - for (i = (int)aw->ep_cache_sz - 1; - i >= 0; i--) { - /* Skip the closed sockets */ - if (aw->ep_cache[i] && IS_VALID_SOCKET(aw->ep_cache[i]->sd)) { - int elapsed = (int)difftime(mstarted, aw->ep_cache[i]->last_access); - if (elapsed > aw->cache_timeout) { - time_t rt = 0; - n++; - if (JK_IS_DEBUG_LEVEL(l)) - rt = time(NULL); - aw->ep_cache[i]->reuse = JK_FALSE; - m_sock[m_count++] = aw->ep_cache[i]->sd; - aw->ep_cache[i]->sd = JK_INVALID_SOCKET; - ajp_reset_endpoint(aw->ep_cache[i], l); - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "cleaning pool slot=%d elapsed %d in %d", - i, elapsed, (int)(difftime(time(NULL), rt))); - } - } - if (cnt <= aw->ep_mincache_sz + n) { - if (JK_IS_DEBUG_LEVEL(l)) { - jk_log(l, JK_LOG_DEBUG, - "reached pool min size %u from %u cache slots", - aw->ep_mincache_sz, aw->ep_cache_sz); - } - break; - } - } - } - /* Handle worker connection keepalive */ - if (aw->conn_ping_interval > 0 && aw->ping_timeout > 0) { - for (i = (int)aw->ep_cache_sz - 1; i >= 0; i--) { - /* Skip the closed sockets */ - if (aw->ep_cache[i] && IS_VALID_SOCKET(aw->ep_cache[i]->sd)) { - int elapsed = (int)difftime(now, aw->ep_cache[i]->last_access); - if (elapsed > aw->conn_ping_interval) { - k++; - /* handle cping/cpong. - */ - if (ajp_handle_cping_cpong(aw->ep_cache[i], - aw->ping_timeout, l) == JK_FALSE) { - jk_log(l, JK_LOG_INFO, - "(%s) failed sending request, " - "socket %d keepalive cping/cpong " - "failure (errno=%d)", - aw->name, - aw->ep_cache[i]->sd, - aw->ep_cache[i]->last_errno); - aw->ep_cache[i]->reuse = JK_FALSE; - m_sock[m_count++] = aw->ep_cache[i]->sd; - aw->ep_cache[i]->sd = JK_INVALID_SOCKET; - ajp_reset_endpoint(aw->ep_cache[i], l); - } - else { - now = time(NULL); - aw->ep_cache[i]->last_access = now; - } - } - } - } - } - JK_LEAVE_CS(&aw->cs, rc); - /* Shutdown sockets outside of the lock. - * This has benefits only if maintain was - * called from the watchdog thread. - */ - for (m = 0; m < m_count; m++) { - jk_shutdown_socket(m_sock[m], l); - } - free(m_sock); - if (n && JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "recycled %u sockets in %d seconds from %u pool slots", - n, (int)(difftime(time(NULL), mstarted)), - aw->ep_cache_sz); - if (k && JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "pinged %u sockets in %d seconds from %u pool slots", - k, (int)(difftime(time(NULL), mstarted)), - aw->ep_cache_sz); - JK_TRACE_EXIT(l); - return JK_TRUE; - } - else { - jk_log(l, JK_LOG_ERROR, - "locking thread (errno=%d)", - errno); - JK_TRACE_EXIT(l); - return JK_FALSE; - - } - } - else { - JK_LOG_NULL_PARAMS(l); - } - - JK_TRACE_EXIT(l); - return JK_FALSE; -} - -int ajp_has_endpoint(jk_worker_t *pThis, - jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - - if (pThis && pThis->worker_private) { - ajp_worker_t *aw = pThis->worker_private; - int rc; - - JK_ENTER_CS(&aw->cs, rc); - if (rc) { - unsigned int slot; - /* Try to find connected socket cache entry */ - for (slot = 0; slot < aw->ep_cache_sz; slot++) { - if (aw->ep_cache[slot]) { - JK_LEAVE_CS(&aw->cs, rc); - return JK_TRUE; - } - } - JK_LEAVE_CS(&aw->cs, rc); - } - else { - jk_log(l, JK_LOG_ERROR, - "locking thread (errno=%d)", errno); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - else { - JK_LOG_NULL_PARAMS(l); - } - - JK_TRACE_EXIT(l); - return JK_FALSE; -} diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.h deleted file mode 100644 index 09940fd9..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.h +++ /dev/null @@ -1,467 +0,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. - */ - -/*************************************************************************** - * Description: common stuff for bi-directional protocol ajp13/ajp14. * - * Author: Gal Shachor * - * Author: Henri Gomez * - * Version: $Revision: 1137200 $ * - ***************************************************************************/ - -#ifndef JK_AJP_COMMON_H -#define JK_AJP_COMMON_H - -#include "jk_service.h" -#include "jk_msg_buff.h" -#include "jk_shm.h" -#include "jk_mt.h" - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -#define JK_AJP_STATE_IDLE (0) -#define JK_AJP_STATE_OK (1) -#define JK_AJP_STATE_ERROR (2) -#define JK_AJP_STATE_PROBE (3) -#define JK_AJP_STATE_DEF (JK_AJP_STATE_IDLE) -#define JK_AJP_STATE_TEXT_IDLE ("OK/IDLE") -#define JK_AJP_STATE_TEXT_OK ("OK") -#define JK_AJP_STATE_TEXT_ERROR ("ERR") -#define JK_AJP_STATE_TEXT_PROBE ("ERR/PRB") -#define JK_AJP_STATE_TEXT_MAX (JK_AJP_STATE_PROBE) -#define JK_AJP_STATE_TEXT_DEF (JK_AJP_STATE_TEXT_IDLE) - -/* We accept doing global maintenance if we are */ -/* JK_AJP_MAINTAIN_TOLERANCE seconds early. */ -#define JK_AJP_MAINTAIN_TOLERANCE (2) - -/* - * Conditional request attributes - * - */ -#define SC_A_CONTEXT (unsigned char)1 -#define SC_A_SERVLET_PATH (unsigned char)2 -#define SC_A_REMOTE_USER (unsigned char)3 -#define SC_A_AUTH_TYPE (unsigned char)4 -#define SC_A_QUERY_STRING (unsigned char)5 -#define SC_A_ROUTE (unsigned char)6 -#define SC_A_SSL_CERT (unsigned char)7 -#define SC_A_SSL_CIPHER (unsigned char)8 -#define SC_A_SSL_SESSION (unsigned char)9 -#define SC_A_REQ_ATTRIBUTE (unsigned char)10 -#define SC_A_SSL_KEY_SIZE (unsigned char)11 /* only in if JkOptions +ForwardKeySize */ -#define SC_A_SECRET (unsigned char)12 -#define SC_A_STORED_METHOD (unsigned char)13 -#define SC_A_ARE_DONE (unsigned char)0xFF - -/* - * AJP private request attributes - * - * The following request attribute is recognized by Tomcat - * to contain the forwarded remote port. - */ -#define SC_A_REQ_REMOTE_PORT ("AJP_REMOTE_PORT") - -/* - * JK public request attributes - * - * Activation state of the worker in the load balancer. - * Can be any of the JK_LB_ACTIVATION_TEXT_* strings - * from jk_lb_worker.h. - */ -#define SC_A_JK_LB_ACTIVATION ("JK_LB_ACTIVATION") - -/* - * Request methods, coded as numbers instead of strings. - * The list of methods was taken from Section 5.1.1 of RFC 2616, - * RFC 2518, the ACL IETF draft, and the DeltaV IESG Proposed Standard. - * Method = "OPTIONS" - * | "GET" - * | "HEAD" - * | "POST" - * | "PUT" - * | "DELETE" - * | "TRACE" - * | "PROPFIND" - * | "PROPPATCH" - * | "MKCOL" - * | "COPY" - * | "MOVE" - * | "LOCK" - * | "UNLOCK" - * | "ACL" - * | "REPORT" - * | "VERSION-CONTROL" - * | "CHECKIN" - * | "CHECKOUT" - * | "UNCHECKOUT" - * | "SEARCH" - * | "MKWORKSPACE" - * | "UPDATE" - * | "LABEL" - * | "MERGE" - * | "BASELINE-CONTROL" - * | "MKACTIVITY" - * - */ -#define SC_M_OPTIONS (unsigned char)1 -#define SC_M_GET (unsigned char)2 -#define SC_M_HEAD (unsigned char)3 -#define SC_M_POST (unsigned char)4 -#define SC_M_PUT (unsigned char)5 -#define SC_M_DELETE (unsigned char)6 -#define SC_M_TRACE (unsigned char)7 -#define SC_M_PROPFIND (unsigned char)8 -#define SC_M_PROPPATCH (unsigned char)9 -#define SC_M_MKCOL (unsigned char)10 -#define SC_M_COPY (unsigned char)11 -#define SC_M_MOVE (unsigned char)12 -#define SC_M_LOCK (unsigned char)13 -#define SC_M_UNLOCK (unsigned char)14 -#define SC_M_ACL (unsigned char)15 -#define SC_M_REPORT (unsigned char)16 -#define SC_M_VERSION_CONTROL (unsigned char)17 -#define SC_M_CHECKIN (unsigned char)18 -#define SC_M_CHECKOUT (unsigned char)19 -#define SC_M_UNCHECKOUT (unsigned char)20 -#define SC_M_SEARCH (unsigned char)21 -#define SC_M_MKWORKSPACE (unsigned char)22 -#define SC_M_UPDATE (unsigned char)23 -#define SC_M_LABEL (unsigned char)24 -#define SC_M_MERGE (unsigned char)25 -#define SC_M_BASELINE_CONTROL (unsigned char)26 -#define SC_M_MKACTIVITY (unsigned char)27 -#define SC_M_JK_STORED (unsigned char)0xFF - -/* - * Frequent request headers, these headers are coded as numbers - * instead of strings. - * - * Accept - * Accept-Charset - * Accept-Encoding - * Accept-Language - * Authorization - * Connection - * Content-Type - * Content-Length - * Cookie - * Cookie2 - * Host - * Pragma - * Referer - * User-Agent - * - */ - -#define SC_ACCEPT (unsigned short)0xA001 -#define SC_ACCEPT_CHARSET (unsigned short)0xA002 -#define SC_ACCEPT_ENCODING (unsigned short)0xA003 -#define SC_ACCEPT_LANGUAGE (unsigned short)0xA004 -#define SC_AUTHORIZATION (unsigned short)0xA005 -#define SC_CONNECTION (unsigned short)0xA006 -#define SC_CONTENT_TYPE (unsigned short)0xA007 -#define SC_CONTENT_LENGTH (unsigned short)0xA008 -#define SC_COOKIE (unsigned short)0xA009 -#define SC_COOKIE2 (unsigned short)0xA00A -#define SC_HOST (unsigned short)0xA00B -#define SC_PRAGMA (unsigned short)0xA00C -#define SC_REFERER (unsigned short)0xA00D -#define SC_USER_AGENT (unsigned short)0xA00E - -/* - * Frequent response headers, these headers are coded as numbers - * instead of strings. - * - * Content-Type - * Content-Language - * Content-Length - * Date - * Last-Modified - * Location - * Set-Cookie - * Servlet-Engine - * Status - * WWW-Authenticate - * - */ - -#define SC_RESP_CONTENT_TYPE (unsigned short)0xA001 -#define SC_RESP_CONTENT_LANGUAGE (unsigned short)0xA002 -#define SC_RESP_CONTENT_LENGTH (unsigned short)0xA003 -#define SC_RESP_DATE (unsigned short)0xA004 -#define SC_RESP_LAST_MODIFIED (unsigned short)0xA005 -#define SC_RESP_LOCATION (unsigned short)0xA006 -#define SC_RESP_SET_COOKIE (unsigned short)0xA007 -#define SC_RESP_SET_COOKIE2 (unsigned short)0xA008 -#define SC_RESP_SERVLET_ENGINE (unsigned short)0xA009 -#define SC_RESP_STATUS (unsigned short)0xA00A -#define SC_RESP_WWW_AUTHENTICATE (unsigned short)0xA00B -#define SC_RES_HEADERS_NUM 11 - -/* - * AJP13/AJP14 use same message structure - */ - -#define AJP_DEF_RETRY_ATTEMPTS (1) - -#define AJP_HEADER_LEN (4) -#define AJP_HEADER_SZ_LEN (2) -#define CHUNK_BUFFER_PAD (12) -#define AJP_DEF_CACHE_TIMEOUT (0) -#define AJP_DEF_CONNECT_TIMEOUT (0) /* NO CONNECTION TIMEOUT => NO CPING/CPONG */ -#define AJP_DEF_REPLY_TIMEOUT (0) /* NO REPLY TIMEOUT */ -#define AJP_DEF_PREPOST_TIMEOUT (0) /* NO PREPOST TIMEOUT => NO CPING/CPONG */ -#define AJP_DEF_RECOVERY_OPTS (0) /* NO RECOVERY / NO */ -#define AJP_DEF_SOCKET_TIMEOUT (0) /* No timeout */ -#define AJP_DEF_PING_TIMEOUT (10000) /* Default CPING/CPONG timeout (10 seconds) */ - -#define AJP_CPING_NONE (0) /* Do not send cping packets */ -#define AJP_CPING_CONNECT (1) /* Send cping on fresh connection */ -#define AJP_CPING_PREPOST (2) /* Send cping before sending request */ -#define AJP_CPING_INTERVAL (4) /* Send cping on regular intervals */ - - -#define RECOVER_ABORT_IF_TCGETREQUEST 0x0001 /* DON'T RECOVER IF TOMCAT FAILS AFTER RECEIVING REQUEST */ -#define RECOVER_ABORT_IF_TCSENDHEADER 0x0002 /* DON'T RECOVER IF TOMCAT FAILS AFTER SENDING HEADERS */ -#define RECOVER_ABORT_IF_CLIENTERROR 0x0004 /* CLOSE THE SOCKET IN CASE OF CLIENT ERROR */ -#define RECOVER_ALWAYS_HTTP_HEAD 0x0008 /* RECOVER HTTP HEAD REQUESTS, EVEN IF ABORT OPTIONS ARE SET */ -#define RECOVER_ALWAYS_HTTP_GET 0x0010 /* RECOVER HTTP GET REQUESTS, EVEN IF ABORT OPTIONS ARE SET */ - -#define JK_MAX_HTTP_STATUS_FAILS 32 /* Should be enough for most 400 and 500 statuses */ - -struct jk_res_data -{ - int status; -#ifdef AS400 - char *msg; -#else - const char *msg; -#endif - unsigned num_headers; - char **header_names; - char **header_values; -}; -typedef struct jk_res_data jk_res_data_t; - -#include "jk_ajp14.h" - -struct ajp_operation; -typedef struct ajp_operation ajp_operation_t; - -struct ajp_endpoint; -typedef struct ajp_endpoint ajp_endpoint_t; - -struct ajp_worker; -typedef struct ajp_worker ajp_worker_t; - -struct ajp_worker -{ - jk_worker_t worker; - /* Shared memory worker data */ - jk_shm_ajp_worker_t *s; - - char name[JK_SHM_STR_SIZ+1]; - /* Sequence counter starting at 0 and increasing - * every time we change the config - */ - volatile unsigned int sequence; - - jk_pool_t p; - jk_pool_atom_t buf[TINY_POOL_SIZE]; - - JK_CRIT_SEC cs; - - struct sockaddr_in worker_inet_addr; /* Contains host and port */ - unsigned connect_retry_attempts; - char host[JK_SHM_STR_SIZ+1]; - int port; - int addr_sequence; /* Whether the address is resolved */ - int maintain_time; - /* - * Open connections cache... - * - * 1. Critical section object to protect the cache. - * 2. Cache size. - * 3. An array of "open" endpoints. - */ - unsigned int ep_cache_sz; - unsigned int ep_mincache_sz; - unsigned int ep_maxcache_sz; - int cache_acquire_timeout; - ajp_endpoint_t **ep_cache; - - int proto; /* PROTOCOL USED AJP13/AJP14 */ - - jk_login_service_t *login; - - /* Weak secret similar with ajp12, used in ajp13 */ - const char *secret; - - /* - * Post physical connect handler. - * AJP14 will set here its login handler - */ - int (*logon) (ajp_endpoint_t * ae, jk_logger_t *l); - - /* - * Handle Socket Timeouts - */ - int socket_timeout; - int socket_connect_timeout; - int keepalive; - int socket_buf; - /* - * Handle Cache Timeouts - */ - int cache_timeout; - - /* - * Handle Connection/Reply Timeouts - */ - int connect_timeout; /* connect cping/cpong delay in ms (0 means disabled) */ - int reply_timeout; /* reply timeout delay in ms (0 means disabled) */ - int prepost_timeout; /* before sending a request cping/cpong timeout delay in ms (0 means disabled) */ - int conn_ping_interval; /* interval for sending keepalive cping packets on - * unused connection */ - int ping_timeout; /* generic cping/cpong timeout. Used for keepalive packets or - * as default for boolean valued connect and prepost timeouts. - */ - unsigned int ping_mode; /* Ping mode flags (which types of cpings should be used) */ - /* - * Recovery options - */ - unsigned int recovery_opts; - - /* - * Public property to enable the number of retry attempts - * on this worker. - */ - int retries; - - unsigned int max_packet_size; /* Maximum AJP Packet size */ - - int retry_interval; /* Number of milliseconds to sleep before doing a retry */ - - /* - * HTTP status that will cause failover (0 means disabled) - */ - unsigned int http_status_fail_num; - int http_status_fail[JK_MAX_HTTP_STATUS_FAILS]; -}; - - -/* - * endpoint, the remote connector which does the work - */ -struct ajp_endpoint -{ - ajp_worker_t *worker; - - jk_pool_t pool; - jk_pool_atom_t buf[BIG_POOL_SIZE]; - - int proto; /* PROTOCOL USED AJP13/AJP14 */ - - jk_sock_t sd; - int reuse; - - /* Used with RECOVER_ABORT_IF_CLIENTERROR to hard abort - write of AJP response on client write errors */ - int hard_close; - - jk_endpoint_t endpoint; - - jk_uint64_t left_bytes_to_send; - - /* time of the last request - handled by this endpoint */ - time_t last_access; - int last_errno; - /* Last operation performed via this endpoint */ - int last_op; - int addr_sequence; /* Whether the address is resolved */ -}; - -/* - * little struct to avoid multiples ptr passing - * this struct is ready to hold upload file fd - * to add upload persistant storage - */ -struct ajp_operation -{ - jk_msg_buf_t *request; /* original request storage */ - jk_msg_buf_t *reply; /* reply storage (chuncked by ajp13 */ - jk_msg_buf_t *post; /* small post data storage area */ - int uploadfd; /* future persistant storage id */ - int recoverable; /* if exchange could be conducted on another TC */ -}; - -/* - * Functions - */ - - -const char *jk_ajp_get_state(ajp_worker_t *aw, jk_logger_t *l); - -int jk_ajp_get_state_code(const char *v); - -int ajp_validate(jk_worker_t *pThis, - jk_map_t *props, - jk_worker_env_t *we, jk_logger_t *l, int proto); - -int ajp_init(jk_worker_t *pThis, - jk_map_t *props, - jk_worker_env_t *we, jk_logger_t *l, int proto); - -int JK_METHOD ajp_worker_factory(jk_worker_t **w, - const char *name, jk_logger_t *l); - -int ajp_destroy(jk_worker_t **pThis, jk_logger_t *l, int proto); - -int JK_METHOD ajp_done(jk_endpoint_t **e, jk_logger_t *l); - -int ajp_get_endpoint(jk_worker_t *pThis, - jk_endpoint_t **pend, jk_logger_t *l, int proto); - -int ajp_connect_to_endpoint(ajp_endpoint_t * ae, jk_logger_t *l); - -void ajp_close_endpoint(ajp_endpoint_t * ae, jk_logger_t *l); - -void jk_ajp_pull(ajp_worker_t * aw, int locked, jk_logger_t *l); - -void jk_ajp_push(ajp_worker_t * aw, int locked, jk_logger_t *l); - -int ajp_connection_tcp_send_message(ajp_endpoint_t * ae, - jk_msg_buf_t *msg, jk_logger_t *l); - -int ajp_connection_tcp_get_message(ajp_endpoint_t * ae, - jk_msg_buf_t *msg, jk_logger_t *l); - -int JK_METHOD ajp_maintain(jk_worker_t *pThis, time_t now, jk_logger_t *l); - -int jk_ajp_get_cping_mode(const char *m, int def); - -int ajp_has_endpoint(jk_worker_t *pThis, jk_logger_t *l); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* JK_AJP_COMMON_H */ - diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.lo deleted file mode 100644 index 9d02a8f0..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.lo +++ /dev/null @@ -1,12 +0,0 @@ -# jk_ajp_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/jk_ajp_common.o' - -# Name of the non-PIC object. -non_pic_object='jk_ajp_common.o' - diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.o deleted file mode 100644 index 2e6679aa..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.c deleted file mode 100644 index edf8c33b..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.c +++ /dev/null @@ -1,1190 +0,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. - */ - -/* - * Description: Socket/Naming manipulation functions - * Based on: Various Jserv files - */ -/** - * @package jk_connect - * @author Gal Shachor - * @author Mladen Turk - * @version $Revision: 1125651 $ - */ - - -#include "jk_connect.h" -#include "jk_util.h" - -#ifdef HAVE_APR -#include "apr_network_io.h" -#include "apr_errno.h" -#include "apr_general.h" -#include "apr_pools.h" -static apr_pool_t *jk_apr_pool = NULL; -#endif - -#ifdef HAVE_SYS_FILIO_H -/* FIONREAD on Solaris et al. */ -#include -#endif -#ifdef HAVE_POLL_H -/* Use poll instead select */ -#include -#endif - -#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__)) -#define JK_IS_SOCKET_ERROR(x) ((x) == SOCKET_ERROR) -#define JK_GET_SOCKET_ERRNO() errno = WSAGetLastError() - WSABASEERR -#else -#define JK_IS_SOCKET_ERROR(x) ((x) == -1) -#define JK_GET_SOCKET_ERRNO() ((void)0) -#endif /* WIN32 */ - -#if defined(NETWARE) && defined(__NOVELL_LIBC__) -#define USE_SOCK_CLOEXEC -#endif - -/* our compiler cant deal with char* <-> const char* ... */ -#if defined(NETWARE) && !defined(__NOVELL_LIBC__) -typedef char* SET_TYPE; -#else -typedef const char* SET_TYPE; -#endif - -/** Set socket to blocking - * @param sd socket to manipulate - * @return errno: fcntl returns -1 (!WIN32) - * pseudo errno: ioctlsocket returns SOCKET_ERROR (WIN32) - * 0: success - */ -static int soblock(jk_sock_t sd) -{ -/* BeOS uses setsockopt at present for non blocking... */ -#if defined (WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__)) - u_long on = 0; - if (JK_IS_SOCKET_ERROR(ioctlsocket(sd, FIONBIO, &on))) { - JK_GET_SOCKET_ERRNO(); - return errno; - } -#else - 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 JK how to make sockets blocking on your platform. -#endif - if (fcntl(sd, F_SETFL, fd_flags) == -1) { - return errno; - } -#endif /* WIN32 || (NETWARE && __NOVELL_LIBC__) */ - return 0; -} - -/** Set socket to non-blocking - * @param sd socket to manipulate - * @return errno: fcntl returns -1 (!WIN32) - * pseudo errno: ioctlsocket returns SOCKET_ERROR (WIN32) - * 0: success - */ -static int sononblock(jk_sock_t sd) -{ -#if defined (WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__)) - u_long on = 1; - if (JK_IS_SOCKET_ERROR(ioctlsocket(sd, FIONBIO, &on))) { - JK_GET_SOCKET_ERRNO(); - return errno; - } -#else - 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 JK how to make sockets non-blocking on your platform. -#endif - if (fcntl(sd, F_SETFL, fd_flags) == -1) { - return errno; - } -#endif /* WIN32 || (NETWARE && __NOVELL_LIBC__) */ - return 0; -} - -#if defined (WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__)) -/* WIN32 implementation */ -/** Non-blocking socket connect - * @param sd socket to connect - * @param addr address to connect to - * @param timeout connect timeout in seconds - * (<=0: no timeout=blocking) - * @param l logger - * @return -1: some kind of error occured - * SOCKET_ERROR: no timeout given and error - * during blocking connect - * 0: success - */ -static int nb_connect(jk_sock_t sd, struct sockaddr *addr, int timeout, jk_logger_t *l) -{ - int rc; - - JK_TRACE_ENTER(l); - - if (timeout <= 0) { - rc = connect(sd, addr, sizeof(struct sockaddr_in)); - JK_TRACE_EXIT(l); - return rc; - } - - if ((rc = sononblock(sd))) { - JK_TRACE_EXIT(l); - return -1; - } - if (JK_IS_SOCKET_ERROR(connect(sd, addr, sizeof(struct sockaddr_in)))) { - struct timeval tv; - fd_set wfdset, efdset; - - if ((rc = WSAGetLastError()) != WSAEWOULDBLOCK) { - soblock(sd); - WSASetLastError(rc); - JK_TRACE_EXIT(l); - return -1; - } - /* wait for the connect to complete or timeout */ - FD_ZERO(&wfdset); - FD_SET(sd, &wfdset); - FD_ZERO(&efdset); - FD_SET(sd, &efdset); - - tv.tv_sec = timeout / 1000; - tv.tv_usec = (timeout % 1000) * 1000; - - rc = select((int)sd + 1, NULL, &wfdset, &efdset, &tv); - if (JK_IS_SOCKET_ERROR(rc) || rc == 0) { - rc = WSAGetLastError(); - soblock(sd); - WSASetLastError(rc); - JK_TRACE_EXIT(l); - return -1; - } - /* Evaluate the efdset */ - if (FD_ISSET(sd, &efdset)) { - /* The connect failed. */ - int rclen = (int)sizeof(rc); - if (getsockopt(sd, SOL_SOCKET, SO_ERROR, (char*) &rc, &rclen)) - rc = 0; - soblock(sd); - if (rc) - WSASetLastError(rc); - JK_TRACE_EXIT(l); - return -1; - } - } - soblock(sd); - JK_TRACE_EXIT(l); - return 0; -} - -#elif !defined(NETWARE) -/* POSIX implementation */ -/** Non-blocking socket connect - * @param sd socket to connect - * @param addr address to connect to - * @param timeout connect timeout in seconds - * (<=0: no timeout=blocking) - * @param l logger - * @return -1: some kind of error occured - * 0: success - */ -static int nb_connect(jk_sock_t sd, struct sockaddr *addr, int timeout, jk_logger_t *l) -{ - int rc = 0; - - JK_TRACE_ENTER(l); - - if (timeout > 0) { - if (sononblock(sd)) { - JK_TRACE_EXIT(l); - return -1; - } - } - do { - rc = connect(sd, addr, sizeof(struct sockaddr_in)); - } while (rc == -1 && errno == EINTR); - - if ((rc == -1) && (errno == EINPROGRESS || errno == EALREADY) - && (timeout > 0)) { - fd_set wfdset; - struct timeval tv; - socklen_t rclen = (socklen_t)sizeof(rc); - - FD_ZERO(&wfdset); - FD_SET(sd, &wfdset); - tv.tv_sec = timeout / 1000; - tv.tv_usec = (timeout % 1000) * 1000; - rc = select(sd + 1, NULL, &wfdset, NULL, &tv); - if (rc <= 0) { - /* Save errno */ - int err = errno; - soblock(sd); - errno = err; - JK_TRACE_EXIT(l); - return -1; - } - rc = 0; -#ifdef SO_ERROR - if (!FD_ISSET(sd, &wfdset) || - (getsockopt(sd, SOL_SOCKET, SO_ERROR, - (char *)&rc, &rclen) < 0) || rc) { - if (rc) - errno = rc; - rc = -1; - } -#endif /* SO_ERROR */ - } - /* Not sure we can be already connected */ - if (rc == -1 && errno == EISCONN) - rc = 0; - soblock(sd); - JK_TRACE_EXIT(l); - return rc; -} -#else -/* NETWARE implementation - blocking for now */ -/** Non-blocking socket connect - * @param sd socket to connect - * @param addr address to connect to - * @param timeout connect timeout in seconds (ignored!) - * @param l logger - * @return -1: some kind of error occured - * 0: success - */ -static int nb_connect(jk_sock_t sd, struct sockaddr *addr, int timeout, jk_logger_t *l) -{ - int rc; - - JK_TRACE_ENTER(l); - - rc = connect(sd, addr, sizeof(struct sockaddr_in)); - JK_TRACE_EXIT(l); - return rc; -} -#endif - - -#ifdef AS400_UTF8 - -/* - * i5/OS V5R4 need EBCDIC for its runtime calls but APR/APACHE works in UTF - */ -in_addr_t jk_inet_addr(const char * addrstr) -{ - in_addr_t addr; - char *ptr; - - ptr = (char *)malloc(strlen(addrstr) + 1); - jk_ascii2ebcdic((char *)addrstr, ptr); - addr = inet_addr(ptr); - free(ptr); - - return(addr); -} - -#endif - -/** Resolve the host IP - * @param host host or ip address - * @param port port - * @param rc return value pointer - * @param l logger - * @return JK_FALSE: some kind of error occured - * JK_TRUE: success - */ -int jk_resolve(const char *host, int port, struct sockaddr_in *rc, - void *pool, jk_logger_t *l) -{ - int x; - struct in_addr laddr; - - JK_TRACE_ENTER(l); - - memset(rc, 0, sizeof(struct sockaddr_in)); - - rc->sin_port = htons((short)port); - rc->sin_family = AF_INET; - - /* Check if we only have digits in the string */ - for (x = 0; host[x] != '\0'; x++) { - if (!isdigit((int)(host[x])) && host[x] != '.') { - break; - } - } - - /* If we found also characters we should make name to IP resolution */ - if (host[x] != '\0') { - -#ifdef HAVE_APR - apr_sockaddr_t *remote_sa, *temp_sa; - char *remote_ipaddr; - - if (!jk_apr_pool) { - if (apr_pool_create(&jk_apr_pool, (apr_pool_t *)pool) != APR_SUCCESS) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - apr_pool_clear(jk_apr_pool); - if (apr_sockaddr_info_get - (&remote_sa, host, APR_UNSPEC, (apr_port_t) port, 0, jk_apr_pool) - != APR_SUCCESS) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - /* Since we are only handling AF_INET (IPV4) address (in_addr_t) */ - /* make sure we find one of those. */ - temp_sa = remote_sa; - while ((NULL != temp_sa) && (AF_INET != temp_sa->family)) - temp_sa = temp_sa->next; - - /* if temp_sa is set, we have a valid address otherwise, just return */ - if (NULL != temp_sa) - remote_sa = temp_sa; - else { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - apr_sockaddr_ip_get(&remote_ipaddr, remote_sa); - - laddr.s_addr = jk_inet_addr(remote_ipaddr); - -#else /* HAVE_APR */ - - /* XXX : WARNING : We should really use gethostbyname_r in multi-threaded env */ - /* Fortunatly when APR is available, ie under Apache 2.0, we use it */ -#if defined(NETWARE) && !defined(__NOVELL_LIBC__) - struct hostent *hoste = gethostbyname((char*)host); -#else - struct hostent *hoste = gethostbyname(host); -#endif - if (!hoste) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - laddr = *((struct in_addr *)hoste->h_addr_list[0]); - -#endif /* HAVE_APR */ - } - else { - /* If we found only digits we use inet_addr() */ - laddr.s_addr = jk_inet_addr(host); - } - memcpy(&(rc->sin_addr), &laddr, sizeof(laddr)); - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -/** Connect to Tomcat - * @param addr address to connect to - * @param keepalive should we set SO_KEEPALIVE (if !=0) - * @param timeout connect timeout in seconds - * (<=0: no timeout=blocking) - * @param sock_buf size of send and recv buffer - * (<=0: use default) - * @param l logger - * @return JK_INVALID_SOCKET: some kind of error occured - * created socket: success - * @remark Cares about errno - */ -jk_sock_t jk_open_socket(struct sockaddr_in *addr, int keepalive, - int timeout, int connect_timeout, - int sock_buf, jk_logger_t *l) -{ - char buf[64]; - jk_sock_t sd; - int set = 1; - int ret = 0; - int flags = 0; -#ifdef SO_LINGER - struct linger li; -#endif - - JK_TRACE_ENTER(l); - - errno = 0; -#if defined(SOCK_CLOEXEC) && defined(USE_SOCK_CLOEXEC) - flags |= SOCK_CLOEXEC; -#endif - sd = socket(AF_INET, SOCK_STREAM | flags, 0); - if (!IS_VALID_SOCKET(sd)) { - JK_GET_SOCKET_ERRNO(); - jk_log(l, JK_LOG_ERROR, - "socket() failed (errno=%d)", errno); - JK_TRACE_EXIT(l); - return JK_INVALID_SOCKET; - } -#if defined(FD_CLOEXEC) && !defined(USE_SOCK_CLOEXEC) - if ((flags = fcntl(sd, F_GETFD)) == -1) { - JK_GET_SOCKET_ERRNO(); - jk_log(l, JK_LOG_ERROR, - "fcntl() failed (errno=%d)", errno); - jk_close_socket(sd, l); - JK_TRACE_EXIT(l); - return JK_INVALID_SOCKET; - } - flags |= FD_CLOEXEC; - if (fcntl(sd, F_SETFD, flags) == -1) { - JK_GET_SOCKET_ERRNO(); - jk_log(l, JK_LOG_ERROR, - "fcntl() failed (errno=%d)", errno); - jk_close_socket(sd, l); - JK_TRACE_EXIT(l); - return JK_INVALID_SOCKET; - } -#endif - - /* Disable Nagle algorithm */ - if (setsockopt(sd, IPPROTO_TCP, TCP_NODELAY, (SET_TYPE)&set, - sizeof(set))) { - JK_GET_SOCKET_ERRNO(); - jk_log(l, JK_LOG_ERROR, - "failed setting TCP_NODELAY (errno=%d)", errno); - jk_close_socket(sd, l); - JK_TRACE_EXIT(l); - return JK_INVALID_SOCKET; - } - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "socket TCP_NODELAY set to On"); - if (keepalive) { -#if defined(WIN32) && !defined(NETWARE) - DWORD dw; - struct tcp_keepalive ka = { 0 }, ks = { 0 }; - if (timeout) - ka.keepalivetime = timeout * 10000; - else - ka.keepalivetime = 60 * 10000; /* 10 minutes */ - ka.keepaliveinterval = 1000; - ka.onoff = 1; - if (WSAIoctl(sd, SIO_KEEPALIVE_VALS, &ka, sizeof(ka), - &ks, sizeof(ks), &dw, NULL, NULL)) { - JK_GET_SOCKET_ERRNO(); - jk_log(l, JK_LOG_ERROR, - "failed setting SIO_KEEPALIVE_VALS (errno=%d)", errno); - jk_close_socket(sd, l); - JK_TRACE_EXIT(l); - return JK_INVALID_SOCKET; - } - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "socket SO_KEEPALIVE set to %d seconds", - ka.keepalivetime / 1000); -#else - set = 1; - if (setsockopt(sd, SOL_SOCKET, SO_KEEPALIVE, (SET_TYPE)&set, - sizeof(set))) { - JK_GET_SOCKET_ERRNO(); - jk_log(l, JK_LOG_ERROR, - "failed setting SO_KEEPALIVE (errno=%d)", errno); - jk_close_socket(sd, l); - JK_TRACE_EXIT(l); - return JK_INVALID_SOCKET; - } - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "socket SO_KEEPALIVE set to On"); -#endif - } - - if (sock_buf > 0) { - set = sock_buf; - /* Set socket send buffer size */ - if (setsockopt(sd, SOL_SOCKET, SO_SNDBUF, (SET_TYPE)&set, - sizeof(set))) { - JK_GET_SOCKET_ERRNO(); - jk_log(l, JK_LOG_ERROR, - "failed setting SO_SNDBUF (errno=%d)", errno); - jk_close_socket(sd, l); - JK_TRACE_EXIT(l); - return JK_INVALID_SOCKET; - } - set = sock_buf; - /* Set socket receive buffer size */ - if (setsockopt(sd, SOL_SOCKET, SO_RCVBUF, (SET_TYPE)&set, - sizeof(set))) { - JK_GET_SOCKET_ERRNO(); - jk_log(l, JK_LOG_ERROR, - "failed setting SO_RCVBUF (errno=%d)", errno); - jk_close_socket(sd, l); - JK_TRACE_EXIT(l); - return JK_INVALID_SOCKET; - } - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "socket SO_SNDBUF and SO_RCVBUF set to %d", - sock_buf); - } - - if (timeout > 0) { -#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__)) - int tmout = timeout * 1000; - setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, - (const char *) &tmout, sizeof(int)); - setsockopt(sd, SOL_SOCKET, SO_SNDTIMEO, - (const char *) &tmout, sizeof(int)); - JK_GET_SOCKET_ERRNO(); -#elif defined(SO_RCVTIMEO) && defined(USE_SO_RCVTIMEO) && defined(SO_SNDTIMEO) && defined(USE_SO_SNDTIMEO) - struct timeval tv; - tv.tv_sec = timeout; - tv.tv_usec = 0; - setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, - (const void *) &tv, sizeof(tv)); - setsockopt(sd, SOL_SOCKET, SO_SNDTIMEO, - (const void *) &tv, sizeof(tv)); -#endif - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "timeout %d set for socket=%d", - timeout, sd); - } -#ifdef SO_NOSIGPIPE - /* The preferred method on Mac OS X (10.2 and later) to prevent SIGPIPEs when - * sending data to a dead peer. Possibly also existing and in use on other BSD - * systems? - */ - set = 1; - if (setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (const char *)&set, - sizeof(int))) { - JK_GET_SOCKET_ERRNO(); - jk_log(l, JK_LOG_ERROR, - "failed setting SO_NOSIGPIPE (errno=%d)", errno); - jk_close_socket(sd, l); - JK_TRACE_EXIT(l); - return JK_INVALID_SOCKET; - } -#endif -#ifdef SO_LINGER - /* Make hard closesocket by disabling lingering */ - li.l_linger = li.l_onoff = 0; - if (setsockopt(sd, SOL_SOCKET, SO_LINGER, (SET_TYPE)&li, - sizeof(li))) { - JK_GET_SOCKET_ERRNO(); - jk_log(l, JK_LOG_ERROR, - "failed setting SO_LINGER (errno=%d)", errno); - jk_close_socket(sd, l); - JK_TRACE_EXIT(l); - return JK_INVALID_SOCKET; - } -#endif - /* Tries to connect to Tomcat (continues trying while error is EINTR) */ - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "trying to connect socket %d to %s", sd, - jk_dump_hinfo(addr, buf)); - -/* Need more infos for BSD 4.4 and Unix 98 defines, for now only -iSeries when Unix98 is required at compil time */ -#if (_XOPEN_SOURCE >= 520) && defined(AS400) - ((struct sockaddr *)addr)->sa_len = sizeof(struct sockaddr_in); -#endif - ret = nb_connect(sd, (struct sockaddr *)addr, connect_timeout, l); -#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__)) - if (JK_IS_SOCKET_ERROR(ret)) { - JK_GET_SOCKET_ERRNO(); - } -#endif /* WIN32 */ - - /* Check if we are connected */ - if (ret) { - jk_log(l, JK_LOG_INFO, - "connect to %s failed (errno=%d)", - jk_dump_hinfo(addr, buf), errno); - jk_close_socket(sd, l); - sd = JK_INVALID_SOCKET; - } - else { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, "socket %d [%s] connected", - sd, jk_dump_sinfo(sd, buf)); - } - JK_TRACE_EXIT(l); - return sd; -} - -/** Close the socket - * @param sd socket to close - * @param l logger - * @return -1: some kind of error occured (!WIN32) - * SOCKET_ERROR: some kind of error occured (WIN32) - * 0: success - * @remark Does not change errno - */ -int jk_close_socket(jk_sock_t sd, jk_logger_t *l) -{ - int rc; - int save_errno; - - JK_TRACE_ENTER(l); - - if (!IS_VALID_SOCKET(sd)) { - JK_TRACE_EXIT(l); - return -1; - } - - save_errno = errno; -#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__)) - rc = closesocket(sd) ? -1 : 0; -#else - do { - rc = close(sd); - } while (JK_IS_SOCKET_ERROR(rc) && (errno == EINTR || errno == EAGAIN)); -#endif - JK_TRACE_EXIT(l); - errno = save_errno; - return rc; -} - -#ifndef MAX_SECS_TO_LINGER -#define MAX_SECS_TO_LINGER 2 -#endif -#define MS_TO_LINGER 500 -#define MS_TO_LINGER_LAST 2 - -#ifndef MAX_LINGER_BYTES -#define MAX_LINGER_BYTES 32768 -#endif - -#ifndef SHUT_WR -#ifdef SD_SEND -#define SHUT_WR SD_SEND -#else -#define SHUT_WR 0x01 -#endif -#endif - -#ifndef SHUT_RD -#ifdef SD_RECEIVE -#define SHUT_RD SD_RECEIVE -#else -#define SHUT_RD 0x00 -#endif -#endif - -/** Drain and close the socket - * @param sd socket to close - * @param l logger - * @return -1: socket to close is invalid - * -1: some kind of error occured (!WIN32) - * SOCKET_ERROR: some kind of error occured (WIN32) - * 0: success - * @remark Does not change errno - */ -int jk_shutdown_socket(jk_sock_t sd, jk_logger_t *l) -{ - char dummy[512]; - char buf[64]; - char *sb = NULL; - int rc = 0; - size_t rd = 0; - size_t rp = 0; - int save_errno; - int timeout = MS_TO_LINGER; - time_t start = time(NULL); - - JK_TRACE_ENTER(l); - - if (!IS_VALID_SOCKET(sd)) { - JK_TRACE_EXIT(l); - return -1; - } - - save_errno = errno; - if (JK_IS_DEBUG_LEVEL(l)) { - sb = jk_dump_sinfo(sd, buf); - jk_log(l, JK_LOG_DEBUG, "About to shutdown socket %d [%s]", - sd, sb); - } - /* Shut down the socket for write, which will send a FIN - * to the peer. - */ - if (shutdown(sd, SHUT_WR)) { - rc = jk_close_socket(sd, l); - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Failed sending SHUT_WR for socket %d [%s]", - sd, sb); - errno = save_errno; - JK_TRACE_EXIT(l); - return rc; - } - - do { - rp = 0; - if (jk_is_input_event(sd, timeout, l)) { - /* Do a restartable read on the socket - * draining out all the data currently in the socket buffer. - */ - do { -#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__)) - rc = recv(sd, &dummy[0], sizeof(dummy), 0); - if (JK_IS_SOCKET_ERROR(rc)) - JK_GET_SOCKET_ERRNO(); -#else - rc = read(sd, &dummy[0], sizeof(dummy)); -#endif - if (rc > 0) - rp += rc; - } while (JK_IS_SOCKET_ERROR(rc) && (errno == EINTR || errno == EAGAIN)); - - if (rc < 0) { - /* Read failed. - * Bail out from the loop. - */ - break; - } - } - else { - /* Error or timeout (reason is logged within jk_is_input_event) - * Exit the drain loop - */ - break; - } - rd += rp; - if (rp < sizeof(dummy)) { - if (timeout > MS_TO_LINGER_LAST) { - /* Try one last time with a short timeout - */ - timeout = MS_TO_LINGER_LAST; - continue; - } - /* We have read less then size of buffer - * It's a good chance there will be no more data - * to read. - */ - if ((rc = sononblock(sd))) { - rc = jk_close_socket(sd, l); - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "error setting socket %d [%s] to nonblocking", - sd, sb); - errno = save_errno; - JK_TRACE_EXIT(l); - return rc; - } - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "shutting down the read side of socket %d [%s]", - sd, sb); - shutdown(sd, SHUT_RD); - break; - } - timeout = MS_TO_LINGER; - } while ((rd < MAX_LINGER_BYTES) && (difftime(time(NULL), start) < MAX_SECS_TO_LINGER)); - - rc = jk_close_socket(sd, l); - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Shutdown socket %d [%s] and read %d lingering bytes in %d sec.", - sd, sb, rd, (int)difftime(time(NULL), start)); - errno = save_errno; - JK_TRACE_EXIT(l); - return rc; -} - -/** send a message - * @param sd socket to use - * @param b buffer containing the data - * @param len length to send - * @param l logger - * @return negative errno: write returns a fatal -1 (!WIN32) - * negative pseudo errno: send returns SOCKET_ERROR (WIN32) - * JK_SOCKET_EOF: no bytes could be sent - * >0: success, provided number of bytes send - * @remark Always closes socket in case of error - * @remark Cares about errno - * @bug this fails on Unixes if len is too big for the underlying - * protocol - */ -int jk_tcp_socket_sendfull(jk_sock_t sd, const unsigned char *b, int len, jk_logger_t *l) -{ - int sent = 0; - int wr; - - JK_TRACE_ENTER(l); - - errno = 0; - while (sent < len) { - do { -#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__)) - wr = send(sd, (const char*)(b + sent), - len - sent, 0); - if (JK_IS_SOCKET_ERROR(wr)) - JK_GET_SOCKET_ERRNO(); -#else - wr = write(sd, b + sent, len - sent); -#endif - } while (JK_IS_SOCKET_ERROR(wr) && (errno == EINTR || errno == EAGAIN)); - - if (JK_IS_SOCKET_ERROR(wr)) { - int err; - jk_shutdown_socket(sd, l); - err = (errno > 0) ? -errno : errno; - JK_TRACE_EXIT(l); - return err; - } - else if (wr == 0) { - jk_shutdown_socket(sd, l); - JK_TRACE_EXIT(l); - return JK_SOCKET_EOF; - } - sent += wr; - } - - JK_TRACE_EXIT(l); - return sent; -} - -/** receive a message - * @param sd socket to use - * @param b buffer to store the data - * @param len length to receive - * @param l logger - * @return negative errno: read returns a fatal -1 (!WIN32) - * negative pseudo errno: recv returns SOCKET_ERROR (WIN32) - * JK_SOCKET_EOF: no bytes could be read - * >0: success, requested number of bytes received - * @remark Always closes socket in case of error - * @remark Cares about errno - */ -int jk_tcp_socket_recvfull(jk_sock_t sd, unsigned char *b, int len, jk_logger_t *l) -{ - int rdlen = 0; - int rd; - - JK_TRACE_ENTER(l); - - errno = 0; - while (rdlen < len) { - do { -#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__)) - rd = recv(sd, (char *)b + rdlen, - len - rdlen, 0); - if (JK_IS_SOCKET_ERROR(rd)) - JK_GET_SOCKET_ERRNO(); -#else - rd = read(sd, (char *)b + rdlen, len - rdlen); -#endif - } while (JK_IS_SOCKET_ERROR(rd) && errno == EINTR); - - if (JK_IS_SOCKET_ERROR(rd)) { - int err = (errno > 0) ? -errno : errno; - jk_shutdown_socket(sd, l); - JK_TRACE_EXIT(l); - return (err == 0) ? JK_SOCKET_EOF : err; - } - else if (rd == 0) { - jk_shutdown_socket(sd, l); - JK_TRACE_EXIT(l); - return JK_SOCKET_EOF; - } - rdlen += rd; - } - - JK_TRACE_EXIT(l); - return rdlen; -} - -/** - * dump a sockaddr_in in A.B.C.D:P in ASCII buffer - * - */ -char *jk_dump_hinfo(struct sockaddr_in *saddr, char *buf) -{ - unsigned long laddr = (unsigned long)htonl(saddr->sin_addr.s_addr); - unsigned short lport = (unsigned short)htons(saddr->sin_port); - - sprintf(buf, "%d.%d.%d.%d:%d", - (int)(laddr >> 24), (int)((laddr >> 16) & 0xff), - (int)((laddr >> 8) & 0xff), (int)(laddr & 0xff), (int)lport); - - return buf; -} - -char *jk_dump_sinfo(jk_sock_t sd, char *buf) -{ - struct sockaddr_in rsaddr; - struct sockaddr_in lsaddr; - socklen_t salen; - - salen = sizeof(struct sockaddr); - if (getsockname(sd, (struct sockaddr *)&lsaddr, &salen) == 0) { - salen = sizeof(struct sockaddr); - if (getpeername(sd, (struct sockaddr *)&rsaddr, &salen) == 0) { - unsigned long laddr = (unsigned long)htonl(lsaddr.sin_addr.s_addr); - unsigned short lport = (unsigned short)htons(lsaddr.sin_port); - unsigned long raddr = (unsigned long)htonl(rsaddr.sin_addr.s_addr); - unsigned short rport = (unsigned short)htons(rsaddr.sin_port); - sprintf(buf, "%d.%d.%d.%d:%d -> %d.%d.%d.%d:%d", - (int)(laddr >> 24), (int)((laddr >> 16) & 0xff), - (int)((laddr >> 8) & 0xff), (int)(laddr & 0xff), (int)lport, - (int)(raddr >> 24), (int)((raddr >> 16) & 0xff), - (int)((raddr >> 8) & 0xff), (int)(raddr & 0xff), (int)rport); - return buf; - } - } - sprintf(buf, "error=%d", errno); - return buf; -} - -/** Wait for input event on socket until timeout - * @param sd socket to use - * @param timeout wait timeout in milliseconds - * @param l logger - * @return JK_FALSE: Timeout expired without something to read - * JK_FALSE: Error during waiting - * JK_TRUE: success - * @remark Does not close socket in case of error - * to allow for iterative waiting - * @remark Cares about errno - */ -#ifdef HAVE_POLL -int jk_is_input_event(jk_sock_t sd, int timeout, jk_logger_t *l) -{ - struct pollfd fds; - int rc; - int save_errno; - char buf[64]; - - JK_TRACE_ENTER(l); - - errno = 0; - fds.fd = sd; - fds.events = POLLIN; - fds.revents = 0; - - do { - rc = poll(&fds, 1, timeout); - } while (rc < 0 && errno == EINTR); - - if (rc == 0) { - if (JK_IS_DEBUG_LEVEL(l)) { - jk_log(l, JK_LOG_DEBUG, - "timeout during poll on socket %d [%s] (timeout=%d)", - sd, jk_dump_sinfo(sd, buf), timeout); - } - /* Timeout. Set the errno to timeout */ - errno = ETIMEDOUT; - JK_TRACE_EXIT(l); - return JK_FALSE; - } - else if (rc < 0) { - save_errno = errno; - if (JK_IS_DEBUG_LEVEL(l)) { - jk_log(l, JK_LOG_DEBUG, - "error during poll on socket %d [%s] (errno=%d)", - sd, jk_dump_sinfo(sd, buf), errno); - } - errno = save_errno; - JK_TRACE_EXIT(l); - return JK_FALSE; - } - if ((fds.revents & (POLLERR | POLLHUP))) { - save_errno = fds.revents & (POLLERR | POLLHUP); - if (JK_IS_DEBUG_LEVEL(l)) { - jk_log(l, JK_LOG_DEBUG, - "error event during poll on socket %d [%s] (event=%d)", - sd, jk_dump_sinfo(sd, buf), save_errno); - } - errno = save_errno; - JK_TRACE_EXIT(l); - return JK_FALSE; - } - errno = 0; - JK_TRACE_EXIT(l); - return JK_TRUE; -} -#else -int jk_is_input_event(jk_sock_t sd, int timeout, jk_logger_t *l) -{ - fd_set rset; - struct timeval tv; - int rc; - int save_errno; - char buf[64]; - - JK_TRACE_ENTER(l); - - errno = 0; - FD_ZERO(&rset); - FD_SET(sd, &rset); - tv.tv_sec = timeout / 1000; - tv.tv_usec = (timeout % 1000) * 1000; - - do { - rc = select((int)sd + 1, &rset, NULL, NULL, &tv); - } while (rc < 0 && errno == EINTR); - - if (rc == 0) { - if (JK_IS_DEBUG_LEVEL(l)) { - jk_log(l, JK_LOG_DEBUG, - "timeout during select on socket %d [%s] (timeout=%d)", - sd, jk_dump_sinfo(sd, buf), timeout); - } - /* Timeout. Set the errno to timeout */ -#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__)) - errno = WSAETIMEDOUT - WSABASEERR; -#else - errno = ETIMEDOUT; -#endif - JK_TRACE_EXIT(l); - return JK_FALSE; - } - else if (rc < 0) { - save_errno = errno; - if (JK_IS_DEBUG_LEVEL(l)) { - jk_log(l, JK_LOG_DEBUG, - "error during select on socket %d [%s] (errno=%d)", - sd, jk_dump_sinfo(sd, buf), errno); - } - errno = save_errno; - JK_TRACE_EXIT(l); - return JK_FALSE; - } - errno = 0; - JK_TRACE_EXIT(l); - return JK_TRUE; -} -#endif - -/** Test if a socket is still connected - * @param sd socket to use - * @param l logger - * @return JK_FALSE: failure - * JK_TRUE: success - * @remark Always closes socket in case of error - * @remark Cares about errno - */ -#ifdef HAVE_POLL -int jk_is_socket_connected(jk_sock_t sd, jk_logger_t *l) -{ - struct pollfd fds; - int rc; - - JK_TRACE_ENTER(l); - - errno = 0; - fds.fd = sd; - fds.events = POLLIN; - - do { - rc = poll(&fds, 1, 0); - } while (rc < 0 && errno == EINTR); - - if (rc == 0) { - /* If we get a timeout, then we are still connected */ - JK_TRACE_EXIT(l); - return JK_TRUE; - } - else if (rc == 1 && fds.revents == POLLIN) { - char buf; - do { - rc = (int)recvfrom(sd, &buf, 1, MSG_PEEK, NULL, NULL); - } while (rc < 0 && errno == EINTR); - if (rc == 1) { - /* There is at least one byte to read. */ - JK_TRACE_EXIT(l); - return JK_TRUE; - } - } - jk_shutdown_socket(sd, l); - - JK_TRACE_EXIT(l); - return JK_FALSE; -} - -#else -int jk_is_socket_connected(jk_sock_t sd, jk_logger_t *l) -{ - fd_set fd; - struct timeval tv; - int rc; - - JK_TRACE_ENTER(l); - - errno = 0; - FD_ZERO(&fd); - FD_SET(sd, &fd); - - /* Initially test the socket without any blocking. - */ - tv.tv_sec = 0; - tv.tv_usec = 0; - - do { - rc = select((int)sd + 1, &fd, NULL, NULL, &tv); - JK_GET_SOCKET_ERRNO(); - /* Wait one microsecond on next select, if EINTR */ - tv.tv_sec = 0; - tv.tv_usec = 1; - } while (JK_IS_SOCKET_ERROR(rc) && errno == EINTR); - - errno = 0; - if (rc == 0) { - /* If we get a timeout, then we are still connected */ - JK_TRACE_EXIT(l); - return JK_TRUE; - } - else if (rc == 1) { -#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__)) - u_long nr; - rc = ioctlsocket(sd, FIONREAD, &nr); - if (rc == 0) { - if (WSAGetLastError() == 0) - errno = 0; - else - JK_GET_SOCKET_ERRNO(); - } -#else - int nr; - rc = ioctl(sd, FIONREAD, (void*)&nr); -#endif - if (rc == 0 && nr != 0) { - JK_TRACE_EXIT(l); - return JK_TRUE; - } - JK_GET_SOCKET_ERRNO(); - } - jk_shutdown_socket(sd, l); - - JK_TRACE_EXIT(l); - return JK_FALSE; -} -#endif - diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.h deleted file mode 100644 index 04edde23..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.h +++ /dev/null @@ -1,78 +0,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. - */ - -/*************************************************************************** - * Description: Socket connections header file * - * Author: Gal Shachor * - * Version: $Revision: 995751 $ * - ***************************************************************************/ - -#ifndef JK_CONNECT_H -#define JK_CONNECT_H - -#include "jk_logger.h" -#include "jk_global.h" - -#if !defined(WIN32) && !(defined(NETWARE) && defined(__NOVELL_LIBC__)) -#define closesocket close -#endif - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -#define JK_SOCKET_EOF (-2) - -int jk_resolve(const char *host, int port, struct sockaddr_in *rc, void *pool, jk_logger_t *l); - -jk_sock_t jk_open_socket(struct sockaddr_in *addr, int keepalive, - int timeout, int connect_timeout, - int sock_buf, jk_logger_t *l); - -int jk_close_socket(jk_sock_t sd, jk_logger_t *l); - -int jk_shutdown_socket(jk_sock_t sd, jk_logger_t *l); - -int jk_tcp_socket_sendfull(jk_sock_t sd, const unsigned char *b, int len, jk_logger_t *l); - -int jk_tcp_socket_recvfull(jk_sock_t sd, unsigned char *b, int len, jk_logger_t *l); - -char *jk_dump_hinfo(struct sockaddr_in *saddr, char *buf); - -char *jk_dump_sinfo(jk_sock_t sd, char *buf); - -int jk_is_input_event(jk_sock_t sd, int timeout, jk_logger_t *l); - -int jk_is_socket_connected(jk_sock_t sd, jk_logger_t *l); - - -/*** - * i5/OS V5R4 need ASCII<->EBCDIC translation for inet_addr() call - */ -#if !defined(AS400_UTF8) - -#define jk_inet_addr inet_addr - -#endif - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* JK_CONNECT_H */ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.lo deleted file mode 100644 index d1cf96e4..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.lo +++ /dev/null @@ -1,12 +0,0 @@ -# jk_connect.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/jk_connect.o' - -# Name of the non-PIC object. -non_pic_object='jk_connect.o' - diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.o deleted file mode 100644 index d33c04e2..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.c deleted file mode 100644 index f65ba836..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.c +++ /dev/null @@ -1,296 +0,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. - */ - -/*************************************************************************** - * Description: Context handling (Autoconf) * - * Author: Henri Gomez * - * Version: $Revision: 466585 $ * - ***************************************************************************/ - -#include "jk_global.h" -#include "jk_context.h" -#include "jk_ajp_common.h" - - -/* - * Set the virtual name of the context - */ - -int context_set_virtual(jk_context_t *c, char *virt) -{ - if (c) { - - if (virt) { - c->virt = jk_pool_strdup(&c->p, virt); - - if (!c->virt) - return JK_FALSE; - } - - return JK_TRUE; - } - - return JK_FALSE; -} - -/* - * Init the context info struct - */ - -int context_open(jk_context_t *c, char *virt) -{ - if (c) { - jk_open_pool(&c->p, c->buf, sizeof(jk_pool_atom_t) * SMALL_POOL_SIZE); - c->size = 0; - c->capacity = 0; - c->contexts = NULL; - - return context_set_virtual(c, virt); - } - - return JK_FALSE; -} - -/* - * Close the context info struct - */ - -int context_close(jk_context_t *c) -{ - if (c) { - - jk_close_pool(&c->p); - return JK_TRUE; - } - - return JK_FALSE; -} - -/* - * Allocate and open context - */ - -int context_alloc(jk_context_t **c, char *virt) -{ - if (c) - return context_open(*c = - (jk_context_t *)calloc(1, sizeof(jk_context_t)), - virt); - - return JK_FALSE; -} - -/* - * Close and destroy context - */ - -int context_free(jk_context_t **c) -{ - if (c && *c) { - context_close(*c); - free(*c); - *c = NULL; - return JK_TRUE; - } - - return JK_FALSE; -} - - -/* - * Ensure there will be memory in context info to store Context Bases - */ - -static int context_realloc(jk_context_t *c) -{ - if (c->size == c->capacity) { - jk_context_item_t **contexts; - int capacity = c->capacity + CBASE_INC_SIZE; - - contexts = - (jk_context_item_t **)jk_pool_alloc(&c->p, - sizeof(jk_context_item_t *) * - capacity); - - if (!contexts) - return JK_FALSE; - - if (c->capacity && c->contexts) - memcpy(contexts, c->contexts, - sizeof(jk_context_item_t *) * c->capacity); - - c->contexts = contexts; - c->capacity = capacity; - } - - return JK_TRUE; -} - -/* - * Ensure there will be memory in context info to URIS - */ - -static int context_item_realloc(jk_context_t *c, jk_context_item_t *ci) -{ - if (ci->size == ci->capacity) { - char **uris; - int capacity = ci->capacity + URI_INC_SIZE; - - uris = (char **)jk_pool_alloc(&c->p, sizeof(char *) * capacity); - - if (!uris) - return JK_FALSE; - - memcpy(uris, ci->uris, sizeof(char *) * ci->capacity); - - ci->uris = uris; - ci->capacity = capacity; - } - - return JK_TRUE; -} - - -/* - * Locate a context base in context list - */ - -jk_context_item_t *context_find_base(jk_context_t *c, char *cbase) -{ - int i; - jk_context_item_t *ci; - - if (!c || !cbase) - return NULL; - - for (i = 0; i < c->size; i++) { - - ci = c->contexts[i]; - - if (!ci) - continue; - - if (!strcmp(ci->cbase, cbase)) - return ci; - } - - return NULL; -} - -/* - * Locate an URI in a context item - */ - -char *context_item_find_uri(jk_context_item_t *ci, char *uri) -{ - int i; - - if (!ci || !uri) - return NULL; - - for (i = 0; i < ci->size; i++) { - if (!strcmp(ci->uris[i], uri)) - return ci->uris[i]; - } - - return NULL; -} - -void context_dump_uris(jk_context_t *c, char *cbase, FILE * f) -{ - jk_context_item_t *ci; - int i; - - ci = context_find_base(c, cbase); - - if (!ci) - return; - - for (i = 0; i < ci->size; i++) - fprintf(f, "/%s/%s\n", ci->cbase, ci->uris[i]); - - fflush(f); -} - - -/* - * Add a new context item to context - */ - -jk_context_item_t *context_add_base(jk_context_t *c, char *cbase) -{ - jk_context_item_t *ci; - - if (!c || !cbase) - return NULL; - - /* Check if the context base was not allready created */ - ci = context_find_base(c, cbase); - - if (ci) - return ci; - - if (context_realloc(c) != JK_TRUE) - return NULL; - - ci = (jk_context_item_t *)jk_pool_alloc(&c->p, sizeof(jk_context_item_t)); - - if (!ci) - return NULL; - - c->contexts[c->size] = ci; - c->size++; - ci->cbase = jk_pool_strdup(&c->p, cbase); - ci->status = 0; - ci->size = 0; - ci->capacity = 0; - ci->uris = NULL; - - return ci; -} - -/* - * Add a new URI to a context item - */ - -int context_add_uri(jk_context_t *c, char *cbase, char *uri) -{ - jk_context_item_t *ci; - - if (!uri) - return JK_FALSE; - - /* Get/Create the context base */ - ci = context_add_base(c, cbase); - - if (!ci) - return JK_FALSE; - - if (context_item_find_uri(ci, uri) != NULL) - return JK_TRUE; - - if (context_item_realloc(c, ci) == JK_FALSE) - return JK_FALSE; - - ci->uris[ci->size] = jk_pool_strdup(&c->p, uri); - - if (ci->uris[ci->size] == NULL) - return JK_FALSE; - - ci->size++; - return JK_TRUE; -} diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.h deleted file mode 100644 index 7c872f58..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.h +++ /dev/null @@ -1,138 +0,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. - */ - -/*************************************************************************** - * Description: Context Stuff (Autoconf) * - * Author: Henri Gomez * - * Version: $Revision: 466585 $ * - ***************************************************************************/ -#ifndef JK_CONTEXT_H -#define JK_CONTEXT_H - -#include "jk_pool.h" - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -#define CBASE_INC_SIZE (8) /* Allocate memory by step of 8 URIs : ie 8 URI by context */ -#define URI_INC_SIZE (8) /* Allocate memory by step of 8 CONTEXTs : ie 8 contexts by worker */ - -typedef struct -{ - - /* - * Context base (ie examples) - */ - - char *cbase; - - /* - * Status (Up/Down) - */ - - int status; - - /* - * Num of URI handled - */ - - int size; - - /* - * Capacity - */ - - int capacity; - - /* - * URL/URIs (autoconf) - */ - - char **uris; -} -jk_context_item_t; - - -typedef struct -{ - - /* - * Memory Pool - */ - - jk_pool_t p; - jk_pool_atom_t buf[SMALL_POOL_SIZE]; - - /* - * Virtual Server (if use) - */ - - char *virt; - - /* - * Num of context handled (ie: examples, admin...) - */ - - int size; - - /* - * Capacity - */ - - int capacity; - - /* - * Context list, context / URIs - */ - - jk_context_item_t **contexts; -} -jk_context_t; - - -/* - * functions defined here - */ - -int context_set_virtual(jk_context_t *c, char *virt); - -int context_open(jk_context_t *c, char *virt); - -int context_close(jk_context_t *c); - -int context_alloc(jk_context_t **c, char *virt); - -int context_free(jk_context_t **c); - -jk_context_item_t *context_find_base(jk_context_t *c, char *cbase); - -char *context_item_find_uri(jk_context_item_t *ci, char *uri); - -void context_dump_uris(jk_context_t *c, char *cbase, FILE * f); - -jk_context_item_t *context_add_base(jk_context_t *c, char *cbase); - -int context_add_uri(jk_context_t *c, char *cbase, char *uri); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* JK_CONTEXT_H */ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.lo deleted file mode 100644 index a03a50c6..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.lo +++ /dev/null @@ -1,12 +0,0 @@ -# jk_context.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/jk_context.o' - -# Name of the non-PIC object. -non_pic_object='jk_context.o' - diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.o deleted file mode 100644 index 88da42a1..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_global.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_global.h deleted file mode 100644 index c041b49a..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_global.h +++ /dev/null @@ -1,405 +0,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. - */ - -/*************************************************************************** - * Description: Global definitions and include files that should exist * - * anywhere * - * Author: Gal Shachor * - * Version: $Revision: 1126561 $ * - ***************************************************************************/ - -#ifndef JK_GLOBAL_H -#define JK_GLOBAL_H - -#if defined(HAVE_CONFIG_H) -#include "config.h" -#endif - -#if defined(WIN32) - -/* 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 - * C4163: '_rotl64' : not available as an intrinsic function - * C4201: nonstandard extension nameless struct/unions - * C4244: int to char/short - precision loss - * C4514: unreferenced inline function removed - */ -#pragma warning(disable: 4100 4127 4163 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 /* defined(_MSC_VER) && _MSC_VER >= 1400 */ -#endif /* defined(WIN32) */ - -#include "jk_version.h" - -#ifdef HAVE_APR -#include "apr_lib.h" -#include "apr_strings.h" -#endif - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef _OSD_POSIX -#include "ap_config.h" -#endif - -#ifdef AS400 -#include "ap_config.h" -extern char *strdup(const char *str); -#endif - -#include -#include - -#ifdef WIN32 -#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 0x0500 -#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 - */ -#include -#include -#include -#endif /* _WINDOWS_ */ -#ifdef _WINDOWS_ -#ifndef SIO_RCVALL -#include -#endif -#endif -#include -#include -#include -#include -#else /* WIN32 */ -#include -#if defined(NETWARE) && defined(__NOVELL_LIBC__) -#include -#define __sys_socket_h__ -#define __netdb_h__ -#define __netinet_in_h__ -#define HAVE_VSNPRINTF -#define HAVE_SNPRINTF -#endif -#include -#include -#include -#include -#ifdef NETWARE -#ifndef _SOCKLEN_T -#define _SOCKLEN_T -typedef int socklen_t; -#endif -#else -#include -#include -#include -#if !defined(_OSD_POSIX) && !defined(AS400) && !defined(__CYGWIN__) && !defined(HPUX11) -#include -#endif -#if !defined(HPUX11) && !defined(AS400) -#include -#endif -#endif /* NETWARE */ - -#include -#include -#endif /* WIN32 */ - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -#define JK_WORKER_FILE_TAG ("worker_file") -#define JK_MOUNT_FILE_TAG ("worker_mount_file") -#define JK_LOG_LEVEL_TAG ("log_level") -#define JK_LOG_FILE_TAG ("log_file") -#define JK_SHM_FILE_TAG ("shm_file") -#define JK_WORKER_NAME_TAG ("worker") - -#define JK_WORKER_FILE_DEF ("workers.properties") - -/* Urimap reload check time. Use 60 seconds by default. - */ -#define JK_URIMAP_DEF_RELOAD (60) - -#define JK_TRUE (1) -#define JK_FALSE (0) - -#define JK_UNSET (-1) - -#define JK_LF (10) -#define JK_CR (13) - -#define JK_SESSION_IDENTIFIER "JSESSIONID" -#define JK_PATH_SESSION_IDENTIFIER ";jsessionid" - -#if defined(WIN32) || defined(NETWARE) -#ifdef __GNUC__ -#define JK_METHOD -#define C_LEVEL_TRY_START -#define C_LEVEL_TRY_END -#define C_LEVEL_FINALLY_START -#define C_LEVEL_FINALLY_END -#else -#define JK_METHOD __stdcall -#define C_LEVEL_TRY_START __try { -#define C_LEVEL_TRY_END } -#define C_LEVEL_FINALLY_START __finally { -#define C_LEVEL_FINALLY_END } -#endif -#define PATH_SEPERATOR (';') -#define FILE_SEPERATOR ('\\') -#define PATH_ENV_VARIABLE ("PATH") - - /* incompatible names... */ -#ifndef strcasecmp -#define strcasecmp stricmp -#endif -#else /* defined(WIN32) || defined(NETWARE) */ -#define JK_METHOD -#define C_LEVEL_TRY_START -#define C_LEVEL_TRY_END -#define C_LEVEL_FINALLY_START -#define C_LEVEL_FINALLY_END -#define PATH_SEPERATOR (':') -#define FILE_SEPERATOR ('/') -#define PATH_ENV_VARIABLE ("LD_LIBRARY_PATH") -#endif /* defined(WIN32) || defined(NETWARE) */ - -/* HTTP Error codes - */ - -#define JK_HTTP_OK 200 -#define JK_HTTP_BAD_REQUEST 400 -#define JK_HTTP_UNAUTHORIZED 401 -#define JK_HTTP_REQUEST_TOO_LARGE 413 -#define JK_HTTP_SERVER_ERROR 500 -#define JK_HTTP_NOT_IMPLEMENTED 501 -#define JK_HTTP_BAD_GATEWAY 502 -#define JK_HTTP_SERVER_BUSY 503 -#define JK_HTTP_GATEWAY_TIME_OUT 504 - - -/* - * RECO STATUS - */ - -#define RECO_NONE 0x00 -#define RECO_INITED 0x01 -#define RECO_FILLED 0x02 - -/* - * JK options - */ - -#define JK_OPT_FWDURIMASK 0x0007 - -#define JK_OPT_FWDURICOMPAT 0x0001 -#define JK_OPT_FWDURICOMPATUNPARSED 0x0002 -#define JK_OPT_FWDURIESCAPED 0x0003 -#define JK_OPT_FWDURIPROXY 0x0004 - -#define JK_OPT_FWDURIDEFAULT JK_OPT_FWDURIPROXY - -#define JK_OPT_FWDDIRS 0x0008 -/* Forward local instead remote address */ -#define JK_OPT_FWDLOCAL 0x0010 -#define JK_OPT_FLUSHPACKETS 0x0020 -#define JK_OPT_FLUSHEADER 0x0040 -#define JK_OPT_DISABLEREUSE 0x0080 -#define JK_OPT_FWDCERTCHAIN 0x0100 -#define JK_OPT_FWDKEYSIZE 0x0200 -#define JK_OPT_REJECTUNSAFE 0x0400 - -#define JK_OPT_DEFAULT (JK_OPT_FWDURIDEFAULT | JK_OPT_FWDKEYSIZE) - -/* Check for EBCDIC systems */ - -/* Check for Apache 2.0 running on an EBCDIC system */ -#if APR_CHARSET_EBCDIC - -#include - -#define USE_CHARSET_EBCDIC -#define jk_xlate_to_ascii(b, l) ap_xlate_proto_to_ascii(b, l) -#define jk_xlate_from_ascii(b, l) ap_xlate_proto_from_ascii(b, l) - -#else /* APR_CHARSET_EBCDIC */ - -/* Check for Apache 1.3 running on an EBCDIC system */ -#ifdef CHARSET_EBCDIC - -#define USE_CHARSET_EBCDIC -#define jk_xlate_to_ascii(b, l) ebcdic2ascii(b, b, l) -#define jk_xlate_from_ascii(b, l) ascii2ebcdic(b, b, l) - -#else /* CHARSET_EBCDIC */ - -/* We're in on an ASCII system */ - -#define jk_xlate_to_ascii(b, l) /* NOOP */ -#define jk_xlate_from_ascii(b, l) /* NOOP */ - -#endif /* CHARSET_EBCDIC */ - -#endif /* APR_CHARSET_EBCDIC */ - -/* on i5/OS V5R4 HTTP/APR APIs and Datas are in UTF */ -#if defined(AS400_UTF8) -#undef USE_CHARSET_EBCDIC -#define jk_xlate_to_ascii(b, l) /* NOOP */ -#define jk_xlate_from_ascii(b, l) /* NOOP */ -#endif - -/* jk_uint32_t defines a four byte word */ -/* jk_uint64_t defines a eight byte word */ -#if defined (WIN32) - typedef unsigned int jk_uint32_t; -#define JK_UINT32_T_FMT "u" -#define JK_UINT32_T_HEX_FMT "x" - typedef unsigned __int64 jk_uint64_t; -#define JK_UINT64_T_FMT "I64u" -#define JK_UINT64_T_HEX_FMT "I64x" -#define JK_PID_T_FMT "d" -#define JK_PTHREAD_T_FMT "d" -#elif defined(AS400) || defined(NETWARE) - typedef unsigned int jk_uint32_t; -#define JK_UINT32_T_FMT "u" -#define JK_UINT32_T_HEX_FMT "x" - typedef unsigned long long jk_uint64_t; -#define JK_UINT64_T_FMT "llu" -#define JK_UINT64_T_HEX_FMT "llx" -#define JK_PID_T_FMT "d" -#define JK_PTHREAD_T_FMT "d" -#else -#include "jk_types.h" -#endif - -#define JK_UINT32_T_FMT_LEN (sizeof(JK_UINT32_T_FMT) - 1) -#define JK_UINT32_T_HEX_FMT_LEN (sizeof(JK_UINT32_T_HEX_FMT) - 1) -#define JK_UINT64_T_FMT_LEN (sizeof(JK_UINT64_T_FMT) - 1) -#define JK_UINT64_T_HEX_FMT_LEN (sizeof(JK_UINT64_T_HEX_FMT) - 1) - -#ifdef WIN32 -/* For WIN32, emulate gettimeofday() using _ftime() */ -#define gettimeofday(tv, tz) { struct _timeb tb; _ftime(&tb); \ - (tv)->tv_sec = (long)tb.time; \ - (tv)->tv_usec = tb.millitm * 1000; } -#define HAVE_VSNPRINTF -#define HAVE_SNPRINTF -#ifdef HAVE_APR -#define snprintf apr_snprintf -#define vsnprintf apr_vsnprintf -#else -/* define snprint to match windows version */ -#define snprintf _snprintf -#define vsnprintf _vsnprintf -#endif -#endif /* WIN32" */ - -/* Use apr snprintf() and vsnprintf() when needed */ -#if defined(HAVE_APR) -#if !defined(HAVE_SNPRINTF) -#define snprintf apr_snprintf -#endif -#if !defined(HAVE_VSNPRINTF) -#define vsnprintf apr_vsnprintf -#endif -#endif - -/* Use ap snprintf() and vsnprintf() when needed */ -#if !defined(HAVE_APR) -#if !defined(HAVE_SNPRINTF) -#define snprintf ap_snprintf -#endif -#if !defined(HAVE_VSNPRINTF) -#define vsnprintf ap_vsnprintf -#endif -#endif - -#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__)) -typedef SOCKET jk_sock_t; -#define IS_VALID_SOCKET(s) ((s) != INVALID_SOCKET) -#define JK_INVALID_SOCKET INVALID_SOCKET -#else -typedef int jk_sock_t; -#define IS_VALID_SOCKET(s) ((s) > 0) -#define JK_INVALID_SOCKET (-1) -#endif - -#ifdef NETWARE -#ifdef __NOVELL_LIBC__ -#define MAX_PATH 511 -#else -#define MAX_PATH 255 -#endif -#endif - -#ifdef AS400_UTF8 -#define strcasecmp(a,b) apr_strnatcasecmp(a,b) -#endif - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* JK_GLOBAL_H */ - diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.c deleted file mode 100644 index 048f4435..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.c +++ /dev/null @@ -1,1267 +0,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. - */ - -/*************************************************************************** - * Description: In process JNI worker * - * Author: Gal Shachor * - * Based on: * - * Version: $Revision: 750428 $ * - ***************************************************************************/ - -#if !defined(WIN32) && !defined(NETWARE) && !defined(AS400) -#include -#endif - -#include - -#include "jk_pool.h" -#include "jk_jni_worker.h" -#include "jk_util.h" - -#if !defined(JNI_VERSION_1_6) -#if defined LINUX && defined APACHE2_SIGHACK -#include -#include -#include -#endif - -#ifdef NETWARE -#ifdef __NOVELL_LIBC__ -#include -#else -#include -#include -#endif -#endif - -#ifndef JNI_VERSION_1_1 -#define JNI_VERSION_1_1 0x00010001 -#endif - -/* probably on an older system that doesn't support RTLD_NOW or RTLD_LAZY. - * The below define is a lie since we are really doing RTLD_LAZY since the - * system doesn't support RTLD_NOW. - */ -#ifndef RTLD_NOW -#define RTLD_NOW 1 -#endif - -#ifndef RTLD_GLOBAL -#define RTLD_GLOBAL 0 -#endif - -#define null_check(e) if ((e) == 0) return JK_FALSE - -jint(JNICALL * jni_get_default_java_vm_init_args) (void *) = NULL; -jint(JNICALL * jni_create_java_vm) (JavaVM **, JNIEnv **, void *) = NULL; -#ifdef AS400 -jint(JNICALL * jni_get_created_java_vms) (JavaVM **, long, long *) = NULL; -#else -jint(JNICALL * jni_get_created_java_vms) (JavaVM **, int, int *) = NULL; -#endif - -#define TC33_JAVA_BRIDGE_CLASS_NAME ("org/apache/tomcat/modules/server/JNIEndpoint") -#define TC32_JAVA_BRIDGE_CLASS_NAME ("org/apache/tomcat/service/JNIEndpoint") - -static jk_worker_t *the_singleton_jni_worker = NULL; - -struct jni_worker -{ - - int was_verified; - int was_initialized; - - jk_pool_t p; - jk_pool_atom_t buf[TINY_POOL_SIZE]; - - /* - * JVM Object pointer. - */ - JavaVM *jvm; - - /* - * [V] JNIEnv used for boostraping from validate -> init w/o an attach - */ - JNIEnv *tmp_env; - - /* - * Web Server to Java bridge, instance and class. - */ - jobject jk_java_bridge_object; - jclass jk_java_bridge_class; - - /* - * Java methods ids, to jump into the JVM - */ - jmethodID jk_startup_method; - jmethodID jk_service_method; - jmethodID jk_shutdown_method; - - /* - * Command line for tomcat startup - */ - char *tomcat_cmd_line; - - /* - * Bridge Type, Tomcat 32/33/40/41/5 - */ - unsigned bridge_type; - - /* - * Classpath - */ - char *tomcat_classpath; - - /* - * Full path to the jni javai/jvm dll - */ - char *jvm_dll_path; - - /* - * Initial Java heap size - */ - unsigned tomcat_ms; - - /* - * Max Java heap size - */ - unsigned tomcat_mx; - - /* - * Java system properties - */ - char **sysprops; - -#ifdef JNI_VERSION_1_2 - /* - * Java 2 initialization options (-X... , -verbose etc.) - */ - char **java2opts; - - /* - * Java 2 lax/strict option checking (bool) - */ - int java2lax; -#endif - - /* - * stdout and stderr file names for Java - */ - char *stdout_name; - char *stderr_name; - - char *name; - jk_worker_t worker; -}; -typedef struct jni_worker jni_worker_t; - -struct jni_endpoint -{ - int attached; - JNIEnv *env; - jni_worker_t *worker; - - jk_endpoint_t endpoint; -}; -typedef struct jni_endpoint jni_endpoint_t; - - -static int load_jvm_dll(jni_worker_t * p, jk_logger_t *l); - -static int open_jvm(jni_worker_t * p, JNIEnv ** env, jk_logger_t *l); - -static int open_jvm1(jni_worker_t * p, JNIEnv ** env, jk_logger_t *l); - -#ifdef JNI_VERSION_1_2 -static int detect_jvm_version(jk_logger_t *l); - -static int open_jvm2(jni_worker_t * p, JNIEnv ** env, jk_logger_t *l); -#endif - - -static int get_bridge_object(jni_worker_t * p, JNIEnv * env, jk_logger_t *l); - -static int get_method_ids(jni_worker_t * p, JNIEnv * env, jk_logger_t *l); - -static JNIEnv *attach_to_jvm(jni_worker_t * p, jk_logger_t *l); - -static void detach_from_jvm(jni_worker_t * p, jk_logger_t *l); - - -/* - Duplicate string and convert it to ASCII on EBDIC based systems - Needed for at least AS/400 (before V5R4 ?) and BS2000 but what about other EBDIC systems ? -*/ -static void *strdup_ascii(jk_pool_t *p, char *s) -{ - char *rc; - rc = jk_pool_strdup(p, s); - -#if defined(AS400) || defined(_OSD_POSIX) - jk_xlate_to_ascii(rc, strlen(rc)); -#endif - - return rc; -} - -#if defined LINUX && defined APACHE2_SIGHACK -static void linux_signal_hack() -{ - sigset_t newM; - sigset_t old; - - sigemptyset(&newM); - pthread_sigmask(SIG_SETMASK, &newM, &old); - - sigdelset(&old, SIGUSR1); - sigdelset(&old, SIGUSR2); - sigdelset(&old, SIGUNUSED); - sigdelset(&old, SIGRTMIN); - sigdelset(&old, SIGRTMIN + 1); - sigdelset(&old, SIGRTMIN + 2); - pthread_sigmask(SIG_SETMASK, &old, NULL); -} - -static void print_signals(sigset_t * sset) -{ - int sig; - for (sig = 1; sig < 20; sig++) { - if (sigismember(sset, sig)) { - printf(" %d", sig); - } - } - printf("\n"); -} -#endif - -/* - * Return values of service() method for jni worker: - * return value is_error reason - * JK_FALSE JK_HTTP_SERVER_ERROR Invalid parameters (null values) - * Error during attach to the JNI backend - * Error during JNI call - * JK_TRUE JK_HTTP_OK All other cases - */ -static int JK_METHOD service(jk_endpoint_t *e, - jk_ws_service_t *s, - jk_logger_t *l, int *is_error) -{ - jni_endpoint_t *p; - jint rc; - - JK_TRACE_ENTER(l); - - if (!e || !e->endpoint_private || !s || !is_error) { - JK_LOG_NULL_PARAMS(l); - if (is_error) - *is_error = JK_HTTP_SERVER_ERROR; - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - p = e->endpoint_private; - - /* Set returned error to OK */ - *is_error = JK_HTTP_OK; - - if (!p->attached) { - /* Try to attach */ - if (!(p->env = attach_to_jvm(p->worker, l))) { - jk_log(l, JK_LOG_EMERG, "Attach failed"); - *is_error = JK_HTTP_SERVER_ERROR; - JK_TRACE_EXIT(l); - return JK_FALSE; - } - p->attached = JK_TRUE; - } - - /* we are attached now */ - - /* - * When we call the JVM we cannot know what happens - * So we can not recover !!! - */ - jk_log(l, JK_LOG_DEBUG, "In service, calling Tomcat..."); - - rc = (*(p->env))->CallIntMethod(p->env, - p->worker->jk_java_bridge_object, - p->worker->jk_service_method, - /* [V] For some reason gcc likes this pointer -> int -> jlong conversion, */ - /* but not the direct pointer -> jlong conversion. I hope it's okay. */ -#ifdef AS400 - s, l -#else - (jlong) (int)s, (jlong) (int)l -#endif - ); - - /* [V] Righ now JNIEndpoint::service() only returns 1 or 0 */ - if (rc) { - jk_log(l, JK_LOG_DEBUG, "Tomcat returned OK, done"); - JK_TRACE_EXIT(l); - return JK_TRUE; - } - else { - jk_log(l, JK_LOG_ERROR, "Tomcat FAILED!"); - *is_error = JK_HTTP_SERVER_ERROR; - JK_TRACE_EXIT(l); - return JK_FALSE; - } -} - -static int JK_METHOD done(jk_endpoint_t **e, jk_logger_t *l) -{ - jni_endpoint_t *p; - - JK_TRACE_ENTER(l); - if (!e || !*e || !(*e)->endpoint_private) { - JK_LOG_NULL_PARAMS(l); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - p = (*e)->endpoint_private; - - if (p->attached) { - detach_from_jvm(p->worker, l); - } - - free(p); - *e = NULL; - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -static int JK_METHOD validate(jk_worker_t *pThis, - jk_map_t *props, - jk_worker_env_t *we, jk_logger_t *l) -{ - jni_worker_t *p; - int mem_config = 0; - int btype = 0; - const char *str_config = NULL; - JNIEnv *env; - - JK_TRACE_ENTER(l); - - if (!pThis || !pThis->worker_private) { - JK_LOG_NULL_PARAMS(l); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - p = pThis->worker_private; - - if (p->was_verified) { - jk_log(l, JK_LOG_DEBUG, "been here before, done"); - JK_TRACE_EXIT(l); - return JK_TRUE; - } - - if (jk_get_worker_mx(props, p->name, (unsigned int *)&mem_config)) { - p->tomcat_mx = mem_config; - } - - if (jk_get_worker_ms(props, p->name, (unsigned int *)&mem_config)) { - p->tomcat_ms = mem_config; - } - - if (jk_get_worker_classpath(props, p->name, &str_config)) { - p->tomcat_classpath = jk_pool_strdup(&p->p, str_config); - } - - if (!p->tomcat_classpath) { - jk_log(l, JK_LOG_EMERG, "no classpath"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (jk_get_worker_bridge_type(props, p->name, (unsigned int *)&btype)) { - p->bridge_type = btype; - } - - if (jk_get_worker_jvm_path(props, p->name, &str_config)) { - p->jvm_dll_path = jk_pool_strdup(&p->p, str_config); - } - - if (!p->jvm_dll_path || !jk_file_exists(p->jvm_dll_path)) { - jk_log(l, JK_LOG_EMERG, "no jvm_dll_path"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (jk_get_worker_cmd_line(props, p->name, &str_config)) { - p->tomcat_cmd_line = jk_pool_strdup(&p->p, str_config); - } - - if (jk_get_worker_stdout(props, p->name, &str_config)) { - p->stdout_name = jk_pool_strdup(&p->p, str_config); - } - - if (jk_get_worker_stderr(props, p->name, &str_config)) { - p->stderr_name = jk_pool_strdup(&p->p, str_config); - } - - if (jk_get_worker_sysprops(props, p->name, &str_config)) { - p->sysprops = jk_parse_sysprops(&p->p, str_config); - } - -#ifdef JNI_VERSION_1_2 - if (jk_get_worker_str_prop(props, p->name, "java2opts", &str_config)) { - /* jk_log(l, JK_LOG_DEBUG, "Got opts: %s", str_config); */ - p->java2opts = jk_parse_sysprops(&p->p, str_config); - } - if (jk_get_worker_int_prop(props, p->name, "java2lax", &mem_config)) { - p->java2lax = mem_config ? JK_TRUE : JK_FALSE; - } -#endif - - if (jk_get_worker_libpath(props, p->name, &str_config)) { - jk_append_libpath(&p->p, str_config); - } - - if (!load_jvm_dll(p, l)) { - jk_log(l, JK_LOG_EMERG, "can't load jvm dll"); - /* [V] no detach needed here */ - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (!open_jvm(p, &env, l)) { - jk_log(l, JK_LOG_EMERG, "can't open jvm"); - /* [V] no detach needed here */ - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (!get_bridge_object(p, env, l)) { - jk_log(l, JK_LOG_EMERG, "can't get bridge object"); - /* [V] the detach here may segfault on 1.1 JVM... */ - detach_from_jvm(p, l); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (!get_method_ids(p, env, l)) { - jk_log(l, JK_LOG_EMERG, "can't get method ids"); - /* [V] the detach here may segfault on 1.1 JVM... */ - detach_from_jvm(p, l); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - p->was_verified = JK_TRUE; - p->tmp_env = env; - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -static int JK_METHOD init(jk_worker_t *pThis, - jk_map_t *props, - jk_worker_env_t *we, jk_logger_t *l) -{ - jni_worker_t *p; - JNIEnv *env; - - JK_TRACE_ENTER(l); - - if (!pThis || !pThis->worker_private) { - JK_LOG_NULL_PARAMS(l); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - p = pThis->worker_private; - - if (p->was_initialized) { - jk_log(l, JK_LOG_DEBUG, "done (been here!)"); - JK_TRACE_EXIT(l); - return JK_TRUE; - } - - if (!p->jvm || - !p->jk_java_bridge_object || - !p->jk_service_method || - !p->jk_startup_method || !p->jk_shutdown_method) { - jk_log(l, JK_LOG_EMERG, "worker not set completely"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - /* [V] init is called from the same thread that called validate */ - /* there is no need to attach to the JVM, just get the env */ - - /* if(env = attach_to_jvm(p,l)) { */ - if ((env = p->tmp_env)) { - jstring cmd_line = (jstring) NULL; - jstring stdout_name = (jstring) NULL; - jstring stderr_name = (jstring) NULL; - jint rc = 0; - - /* AS400/BS2000 need EBCDIC to ASCII conversion for JNI */ - - if (p->tomcat_cmd_line) { - cmd_line = - (*env)->NewStringUTF(env, - strdup_ascii(&p->p, p->tomcat_cmd_line)); - } - if (p->stdout_name) { - stdout_name = - (*env)->NewStringUTF(env, - strdup_ascii(&p->p, p->stdout_name)); - } - if (p->stderr_name) { - stderr_name = - (*env)->NewStringUTF(env, - strdup_ascii(&p->p, p->stderr_name)); - } - - jk_log(l, JK_LOG_DEBUG, - "calling Tomcat to intialize itself..."); - rc = (*env)->CallIntMethod(env, p->jk_java_bridge_object, - p->jk_startup_method, cmd_line, - stdout_name, stderr_name); - - detach_from_jvm(p, l); - - if (rc) { - p->was_initialized = JK_TRUE; - jk_log(l, JK_LOG_DEBUG, "Tomcat initialized OK, done"); - JK_TRACE_EXIT(l); - return JK_TRUE; - } - else { - jk_log(l, JK_LOG_EMERG, "could not initialize Tomcat"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - else { - jk_log(l, JK_LOG_ERROR, - "In init, FIXME: init didn't gen env from validate!"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } -} - -static int JK_METHOD get_endpoint(jk_worker_t *pThis, - jk_endpoint_t **pend, jk_logger_t *l) -{ - /* [V] This slow, needs replacement */ - jni_endpoint_t *p; - - JK_TRACE_ENTER(l); - - if (!pThis || !pThis->worker_private || !pend) { - JK_LOG_NULL_PARAMS(l); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - p = (jni_endpoint_t *) calloc(1, sizeof(jni_endpoint_t)); - if (p) { - p->attached = JK_FALSE; - p->env = NULL; - p->worker = pThis->worker_private; - p->endpoint.endpoint_private = p; - p->endpoint.service = service; - p->endpoint.done = done; - *pend = &p->endpoint; - - JK_TRACE_EXIT(l); - return JK_TRUE; - } - else { - jk_log(l, JK_LOG_ERROR, - "could not allocate endpoint"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } -} - -static int JK_METHOD destroy(jk_worker_t **pThis, jk_logger_t *l) -{ - jni_worker_t *p; - JNIEnv *env; - - JK_TRACE_ENTER(l); - - if (!pThis || !*pThis || !(*pThis)->worker_private) { - JK_LOG_NULL_PARAMS(l); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - p = (*pThis)->worker_private; - - if (!p->jvm) { - jk_log(l, JK_LOG_DEBUG, "JVM not intantiated"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (!p->jk_java_bridge_object || !p->jk_shutdown_method) { - jk_log(l, JK_LOG_DEBUG, "Tomcat not intantiated"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if ((env = attach_to_jvm(p, l))) { - jk_log(l, JK_LOG_DEBUG, "shutting down Tomcat..."); - (*env)->CallVoidMethod(env, - p->jk_java_bridge_object, - p->jk_shutdown_method); - detach_from_jvm(p, l); - } - - jk_close_pool(&p->p); - free(p); - - jk_log(l, JK_LOG_DEBUG, "destroyed"); - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -int JK_METHOD jni_worker_factory(jk_worker_t **w, - const char *name, jk_logger_t *l) -{ - jni_worker_t *private_data; - - JK_TRACE_ENTER(l); - - jk_log(l, JK_LOG_WARNING, - "Worker '%s' is of type jni, which is deprecated " - "and will be removed in a future release.", - name ? name : "(null)"); - - if (!name || !w) { - JK_LOG_NULL_PARAMS(l); - JK_TRACE_EXIT(l); - return 0; - } - - if (the_singleton_jni_worker) { - jk_log(l, JK_LOG_DEBUG, - "instance already created"); - *w = the_singleton_jni_worker; - JK_TRACE_EXIT(l); - return JK_JNI_WORKER_TYPE; - } - - private_data = (jni_worker_t *) malloc(sizeof(jni_worker_t)); - - if (!private_data) { - jk_log(l, JK_LOG_ERROR, - "memory allocation error"); - JK_TRACE_EXIT(l); - return 0; - } - - jk_open_pool(&private_data->p, - private_data->buf, sizeof(jk_pool_atom_t) * TINY_POOL_SIZE); - - private_data->name = jk_pool_strdup(&private_data->p, name); - - if (!private_data->name) { - jk_log(l, JK_LOG_ERROR, - "memory allocation error"); - jk_close_pool(&private_data->p); - free(private_data); - JK_TRACE_EXIT(l); - return 0; - } - - private_data->was_verified = JK_FALSE; - private_data->was_initialized = JK_FALSE; - private_data->jvm = NULL; - private_data->tmp_env = NULL; - private_data->jk_java_bridge_object = (jobject) NULL; - private_data->jk_java_bridge_class = (jclass) NULL; - private_data->jk_startup_method = (jmethodID) NULL; - private_data->jk_service_method = (jmethodID) NULL; - private_data->jk_shutdown_method = (jmethodID) NULL; - private_data->tomcat_cmd_line = NULL; - private_data->tomcat_classpath = NULL; - private_data->bridge_type = TC33_BRIDGE_TYPE; - private_data->jvm_dll_path = NULL; - private_data->tomcat_ms = 0; - private_data->tomcat_mx = 0; - private_data->sysprops = NULL; -#ifdef JNI_VERSION_1_2 - private_data->java2opts = NULL; - private_data->java2lax = JK_TRUE; -#endif - private_data->stdout_name = NULL; - private_data->stderr_name = NULL; - - private_data->worker.worker_private = private_data; - private_data->worker.validate = validate; - private_data->worker.init = init; - private_data->worker.get_endpoint = get_endpoint; - private_data->worker.destroy = destroy; - - *w = &private_data->worker; - the_singleton_jni_worker = &private_data->worker; - - JK_TRACE_EXIT(l); - return JK_JNI_WORKER_TYPE; -} - -static int load_jvm_dll(jni_worker_t * p, jk_logger_t *l) -{ -#ifdef WIN32 - HINSTANCE hInst = LoadLibrary(p->jvm_dll_path); - if (hInst) { - (FARPROC) jni_create_java_vm = - GetProcAddress(hInst, "JNI_CreateJavaVM"); - - (FARPROC) jni_get_created_java_vms = - GetProcAddress(hInst, "JNI_GetCreatedJavaVMs"); - - (FARPROC) jni_get_default_java_vm_init_args = - GetProcAddress(hInst, "JNI_GetDefaultJavaVMInitArgs"); - - jk_log(l, JK_LOG_DEBUG, "Loaded all JNI procs"); - - if (jni_create_java_vm && jni_get_default_java_vm_init_args - && jni_get_created_java_vms) { - return JK_TRUE; - } - - FreeLibrary(hInst); - } -#elif defined(NETWARE) && !defined(__NOVELL_LIBC__) - int javaNlmHandle = FindNLMHandle("JVM"); - if (0 == javaNlmHandle) { - /* if we didn't get a handle, try to load java and retry getting the */ - /* handle */ - spawnlp(P_NOWAIT, "JVM.NLM", NULL); - ThreadSwitchWithDelay(); - javaNlmHandle = FindNLMHandle("JVM"); - if (0 == javaNlmHandle) - printf("Error loading Java."); - - } - if (0 != javaNlmHandle) { - jni_create_java_vm = ImportSymbol(GetNLMHandle(), "JNI_CreateJavaVM"); - jni_get_created_java_vms = - ImportSymbol(GetNLMHandle(), "JNI_GetCreatedJavaVMs"); - jni_get_default_java_vm_init_args = - ImportSymbol(GetNLMHandle(), "JNI_GetDefaultJavaVMInitArgs"); - } - if (jni_create_java_vm && jni_get_default_java_vm_init_args - && jni_get_created_java_vms) { - return JK_TRUE; - } -#elif defined(AS400) - jk_log(l, JK_LOG_DEBUG, - "Direct reference to JNI entry points (no SRVPGM)"); - jni_create_java_vm = &JNI_CreateJavaVM; - jni_get_default_java_vm_init_args = &JNI_GetDefaultJavaVMInitArgs; - jni_get_created_java_vms = &JNI_GetCreatedJavaVMs; -#else - void *handle; - jk_log(l, JK_LOG_DEBUG, "loading JVM %s", p->jvm_dll_path); - - handle = dlopen(p->jvm_dll_path, RTLD_NOW | RTLD_GLOBAL); - - if (!handle) { - jk_log(l, JK_LOG_EMERG, - "Can't load native library %s : %s", p->jvm_dll_path, - dlerror()); - } - else { - jni_create_java_vm = dlsym(handle, "JNI_CreateJavaVM"); - jni_get_default_java_vm_init_args = - dlsym(handle, "JNI_GetDefaultJavaVMInitArgs"); - jni_get_created_java_vms = dlsym(handle, "JNI_GetCreatedJavaVMs"); - - if (jni_create_java_vm && jni_get_default_java_vm_init_args && - jni_get_created_java_vms) { - jk_log(l, JK_LOG_DEBUG, - "In load_jvm_dll, symbols resolved, done"); - return JK_TRUE; - } - jk_log(l, JK_LOG_EMERG, - "Can't resolve JNI_CreateJavaVM or JNI_GetDefaultJavaVMInitArgs"); - dlclose(handle); - } -#endif - return JK_FALSE; -} - -static int open_jvm(jni_worker_t * p, JNIEnv ** env, jk_logger_t *l) -{ -#ifdef JNI_VERSION_1_2 - int jvm_version = detect_jvm_version(l); - - switch (jvm_version) { - case JNI_VERSION_1_1: - return open_jvm1(p, env, l); - case JNI_VERSION_1_2: - return open_jvm2(p, env, l); - default: - return JK_FALSE; - } -#else - /* [V] Make sure this is _really_ visible */ -#warning ------------------------------------------------------- -#warning NO JAVA 2 HEADERS! SUPPORT FOR JAVA 2 FEATURES DISABLED -#warning ------------------------------------------------------- - return open_jvm1(p, env, l); -#endif -} - -static int open_jvm1(jni_worker_t * p, JNIEnv ** env, jk_logger_t *l) -{ - JDK1_1InitArgs vm_args; - JNIEnv *penv; - int err; - *env = NULL; - - JK_TRACE_ENTER(l); - - vm_args.version = JNI_VERSION_1_1; - - if (0 != jni_get_default_java_vm_init_args(&vm_args)) { - jk_log(l, JK_LOG_EMERG, "can't get default vm init args"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - jk_log(l, JK_LOG_DEBUG, "got default jvm args"); - - if (vm_args.classpath) { - size_t len = strlen(vm_args.classpath) + - strlen(p->tomcat_classpath) + 3; - char *tmp = jk_pool_alloc(&p->p, len); - if (tmp) { - sprintf(tmp, "%s%c%s", - strdup_ascii(&p->p, p->tomcat_classpath), - PATH_SEPERATOR, vm_args.classpath); - p->tomcat_classpath = tmp; - } - else { - jk_log(l, JK_LOG_EMERG, - "allocation error for classpath"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - vm_args.classpath = p->tomcat_classpath; - - if (p->tomcat_mx) { - vm_args.maxHeapSize = p->tomcat_mx; - } - - if (p->tomcat_ms) { - vm_args.minHeapSize = p->tomcat_ms; - } - - if (p->sysprops) { - /* No EBCDIC to ASCII conversion here for AS/400 - later */ - vm_args.properties = p->sysprops; - } - - jk_log(l, JK_LOG_DEBUG, "In open_jvm1, about to create JVM..."); - if ((err = jni_create_java_vm(&(p->jvm), &penv, &vm_args)) != 0) { - jk_log(l, JK_LOG_EMERG, - "could not create JVM, code: %d ", err); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - jk_log(l, JK_LOG_DEBUG, "JVM created, done"); - - *env = penv; - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -#ifdef JNI_VERSION_1_2 -static int detect_jvm_version(jk_logger_t *l) -{ - JNIEnv *env = NULL; - JDK1_1InitArgs vm_args; - - JK_TRACE_ENTER(l); - - /* [V] Idea: ask for 1.2. If the JVM is 1.1 it will return 1.1 instead */ - /* Note: asking for 1.1 won't work, 'cause 1.2 JVMs will return 1.1 */ - vm_args.version = JNI_VERSION_1_2; - - if (0 != jni_get_default_java_vm_init_args(&vm_args)) { - jk_log(l, JK_LOG_EMERG, "can't get default vm init args"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - jk_log(l, JK_LOG_DEBUG, - "found version: %X, done", vm_args.version); - - JK_TRACE_EXIT(l); - return vm_args.version; -} - -static char *build_opt_str(jk_pool_t *p, - char *opt_name, char *opt_value, jk_logger_t *l) -{ - size_t len = strlen(opt_name) + strlen(opt_value) + 2; - - /* [V] IMHO, these should not be deallocated as long as the JVM runs */ - char *tmp = jk_pool_alloc(p, len); - - if (tmp) { - sprintf(tmp, "%s%s", opt_name, opt_value); - return tmp; - } - else { - jk_log(l, JK_LOG_EMERG, - "allocation error for %s", opt_name); - return NULL; - } -} - -static char *build_opt_int(jk_pool_t *p, - char *opt_name, int opt_value, jk_logger_t *l) -{ - /* [V] this should suffice even for 64-bit int */ - size_t len = strlen(opt_name) + 20 + 2; - /* [V] IMHO, these should not be deallocated as long as the JVM runs */ - char *tmp = jk_pool_alloc(p, len); - - if (tmp) { - sprintf(tmp, "%s%d", opt_name, opt_value); - return tmp; - } - else { - jk_log(l, JK_LOG_EMERG, - "allocation error for %s", opt_name); - return NULL; - } -} - -static int open_jvm2(jni_worker_t * p, JNIEnv ** env, jk_logger_t *l) -{ - JavaVMInitArgs vm_args; - JNIEnv *penv = NULL; - JavaVMOption options[100]; - int optn = 0, err; - char *tmp; - - *env = NULL; - - JK_TRACE_ENTER(l); - - vm_args.version = JNI_VERSION_1_2; - vm_args.options = options; - -/* AS/400 need EBCDIC to ASCII conversion to parameters passed to JNI */ -/* No conversion for ASCII based systems (what about BS2000 ?) */ - - if (p->tomcat_classpath) { - jk_log(l, JK_LOG_DEBUG, "setting classpath to %s", - p->tomcat_classpath); - tmp = - build_opt_str(&p->p, "-Djava.class.path=", p->tomcat_classpath, - l); - null_check(tmp); - options[optn++].optionString = strdup_ascii(&p->p, tmp); - } - - if (p->tomcat_mx) { - jk_log(l, JK_LOG_DEBUG, "setting max heap to %d", - p->tomcat_mx); - tmp = build_opt_int(&p->p, "-Xmx", p->tomcat_mx, l); - null_check(tmp); - options[optn++].optionString = strdup_ascii(&p->p, tmp); - } - - if (p->tomcat_ms) { - jk_log(l, JK_LOG_DEBUG, "setting start heap to %d", - p->tomcat_ms); - tmp = build_opt_int(&p->p, "-Xms", p->tomcat_ms, l); - null_check(tmp); - options[optn++].optionString = strdup_ascii(&p->p, tmp); - } - - if (p->sysprops) { - int i = 0; - while (p->sysprops[i]) { - jk_log(l, JK_LOG_DEBUG, "setting %s", - p->sysprops[i]); - tmp = build_opt_str(&p->p, "-D", p->sysprops[i], l); - null_check(tmp); - options[optn++].optionString = strdup_ascii(&p->p, tmp); - i++; - } - } - - if (p->java2opts) { - int i = 0; - - while (p->java2opts[i]) { - jk_log(l, JK_LOG_DEBUG, "using option: %s", - p->java2opts[i]); - /* Pass it "as is" */ - options[optn++].optionString = - strdup_ascii(&p->p, p->java2opts[i++]); - } - } - - vm_args.nOptions = optn; - - if (p->java2lax) { - jk_log(l, JK_LOG_DEBUG, - "the JVM will ignore unknown options"); - vm_args.ignoreUnrecognized = JNI_TRUE; - } - else { - jk_log(l, JK_LOG_DEBUG, - "the JVM will FAIL if it finds unknown options"); - vm_args.ignoreUnrecognized = JNI_FALSE; - } - - jk_log(l, JK_LOG_DEBUG, "about to create JVM..."); - - err = jni_create_java_vm(&(p->jvm), &penv, &vm_args); - - if (JNI_EEXIST == err) { -#ifdef AS400 - long vmCount; -#else - int vmCount; -#endif - jk_log(l, JK_LOG_DEBUG, "JVM alread instantiated." - "Trying to attach instead."); - - jni_get_created_java_vms(&(p->jvm), 1, &vmCount); - if (NULL != p->jvm) - penv = attach_to_jvm(p, l); - - if (NULL != penv) - err = 0; - } - - if (err != 0) { - jk_log(l, JK_LOG_EMERG, "Fail-> could not create JVM, code: %d ", - err); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - *env = penv; - jk_log(l, JK_LOG_DEBUG, "JVM created"); - - JK_TRACE_EXIT(l); - return JK_TRUE; -} -#endif - -static int get_bridge_object(jni_worker_t * p, JNIEnv * env, jk_logger_t *l) -{ - char *btype; - char *ctype; - - jmethodID constructor_method_id; - - JK_TRACE_ENTER(l); - - switch (p->bridge_type) { - case TC32_BRIDGE_TYPE: - btype = TC32_JAVA_BRIDGE_CLASS_NAME; - break; - - case TC33_BRIDGE_TYPE: - btype = TC33_JAVA_BRIDGE_CLASS_NAME; - break; - - case TC40_BRIDGE_TYPE: - case TC41_BRIDGE_TYPE: - case TC50_BRIDGE_TYPE: - jk_log(l, JK_LOG_EMERG, "Bridge type %d not supported", - p->bridge_type); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - -/* AS400/BS2000 need conversion from EBCDIC to ASCII before passing to JNI */ -/* for others, strdup_ascii is just jk_pool_strdup */ - - ctype = strdup_ascii(&p->p, btype); - - p->jk_java_bridge_class = (*env)->FindClass(env, ctype); - - if (!p->jk_java_bridge_class) { - jk_log(l, JK_LOG_EMERG, "Can't find class %s", btype); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - jk_log(l, JK_LOG_DEBUG, - "In get_bridge_object, loaded %s bridge class", btype); - - constructor_method_id = (*env)->GetMethodID(env, p->jk_java_bridge_class, strdup_ascii(&p->p, ""), /* method name */ - strdup_ascii(&p->p, "()V")); /* method sign */ - - if (!constructor_method_id) { - p->jk_java_bridge_class = (jclass) NULL; - jk_log(l, JK_LOG_EMERG, "Can't find constructor"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - p->jk_java_bridge_object = (*env)->NewObject(env, - p->jk_java_bridge_class, - constructor_method_id); - if (!p->jk_java_bridge_object) { - p->jk_java_bridge_class = (jclass) NULL; - jk_log(l, JK_LOG_EMERG, "Can't create new bridge object"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - p->jk_java_bridge_object = - (jobject) (*env)->NewGlobalRef(env, p->jk_java_bridge_object); - if (!p->jk_java_bridge_object) { - jk_log(l, JK_LOG_EMERG, "Can't create global ref to bridge object"); - p->jk_java_bridge_class = (jclass) NULL; - p->jk_java_bridge_object = (jobject) NULL; - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -static int get_method_ids(jni_worker_t * p, JNIEnv * env, jk_logger_t *l) -{ - -/* AS400/BS2000 need conversion from EBCDIC to ASCII before passing to JNI */ - - p->jk_startup_method = (*env)->GetMethodID(env, - p->jk_java_bridge_class, - strdup_ascii(&p->p, "startup"), - strdup_ascii(&p->p, - "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I")); - - if (!p->jk_startup_method) { - jk_log(l, JK_LOG_EMERG, "Can't find startup()"); - return JK_FALSE; - } - - p->jk_service_method = (*env)->GetMethodID(env, - p->jk_java_bridge_class, - strdup_ascii(&p->p, "service"), - strdup_ascii(&p->p, "(JJ)I")); - - if (!p->jk_service_method) { - jk_log(l, JK_LOG_EMERG, "Can't find service()"); - return JK_FALSE; - } - - p->jk_shutdown_method = (*env)->GetMethodID(env, - p->jk_java_bridge_class, - strdup_ascii(&p->p, - "shutdown"), - strdup_ascii(&p->p, "()V")); - - if (!p->jk_shutdown_method) { - jk_log(l, JK_LOG_EMERG, "Can't find shutdown()"); - return JK_FALSE; - } - - return JK_TRUE; -} - -static JNIEnv *attach_to_jvm(jni_worker_t * p, jk_logger_t *l) -{ - JNIEnv *rc = NULL; - /* [V] This message is important. If there are signal mask issues, * - * the JVM usually hangs when a new thread tries to attach to it */ - JK_TRACE_ENTER(l); - -#if defined LINUX && defined APACHE2_SIGHACK - linux_signal_hack(); -#endif - - if (0 == (*(p->jvm))->AttachCurrentThread(p->jvm, -#ifdef JNI_VERSION_1_2 - (void **) -#endif - &rc, NULL)) { - jk_log(l, JK_LOG_DEBUG, "In attach_to_jvm, attached ok"); - JK_TRACE_EXIT(l); - return rc; - } - jk_log(l, JK_LOG_ERROR, - "In attach_to_jvm, cannot attach thread to JVM."); - JK_TRACE_EXIT(l); - return NULL; -} - -/* -static JNIEnv *attach_to_jvm(jni_worker_t *p) -{ - JNIEnv *rc = NULL; - -#ifdef LINUX - linux_signal_hack(); -#endif - - if(0 == (*(p->jvm))->AttachCurrentThread(p->jvm, -#ifdef JNI_VERSION_1_2 - (void **) -#endif - &rc, - NULL)) { - return rc; - } - - return NULL; -} -*/ -static void detach_from_jvm(jni_worker_t * p, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - if (!p->jvm || !(*(p->jvm))) { - jk_log(l, JK_LOG_ERROR, - "cannot detach from NULL JVM."); - } - - if (0 == (*(p->jvm))->DetachCurrentThread(p->jvm)) { - jk_log(l, JK_LOG_DEBUG, "detached ok"); - } - else { - jk_log(l, JK_LOG_ERROR, - "cannot detach from JVM."); - } - JK_TRACE_EXIT(l); -} -#else -int JK_METHOD jni_worker_factory(jk_worker_t **w, - const char *name, jk_logger_t *l) -{ - jk_log(l, JK_LOG_WARNING, - "Worker '%s' is of type jni, which is deprecated " - "and will be removed in a future release.", - name ? name : "(null)"); - if (w) - *w = NULL; - return 0; -} -#endif /* JNI_VERSION_1_6 */ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.h deleted file mode 100644 index 0adef2ab..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.h +++ /dev/null @@ -1,45 +0,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. - */ - -/*************************************************************************** - * Description: jni worker header file * - * Author: Gal Shachor * - * Version: $Revision: 466585 $ * - ***************************************************************************/ - -#ifndef JK_JNI_WORKER_H -#define JK_JNI_WORKER_H - -#include "jk_logger.h" -#include "jk_service.h" - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -#define JK_JNI_WORKER_NAME ("jni") -#define JK_JNI_WORKER_TYPE (4) - -int JK_METHOD jni_worker_factory(jk_worker_t **w, - const char *name, jk_logger_t *l); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* JK_JNI_WORKER_H */ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.lo deleted file mode 100644 index b3a8ed60..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.lo +++ /dev/null @@ -1,12 +0,0 @@ -# jk_jni_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/jk_jni_worker.o' - -# Name of the non-PIC object. -non_pic_object='jk_jni_worker.o' - diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.o deleted file mode 100644 index 9f00e3e5..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.c deleted file mode 100644 index 3c0ce67a..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.c +++ /dev/null @@ -1,1823 +0,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. - */ - -/*************************************************************************** - * Description: Load balancer worker, knows how to load balance among * - * several workers. * - * Author: Gal Shachor * - * Author: Mladen Turk * - * Author: Rainer Jung * - * Based on: * - * Version: $Revision: 1137200 $ * - ***************************************************************************/ - -#include "jk_pool.h" -#include "jk_service.h" -#include "jk_util.h" -#include "jk_worker.h" -#include "jk_lb_worker.h" -#include "jk_ajp13.h" -#include "jk_ajp13_worker.h" -#include "jk_ajp14_worker.h" -#include "jk_mt.h" -#include "jk_shm.h" - -/* - * The load balancing code in this - */ - -/* - * The following two macros need to be kept in sync with - * the existing values for state and activation. - * Note: state <= JK_LB_STATE_FORCE is equivalent to - * state is none of JK_LB_STATE_BUSY, JK_LB_STATE_ERROR, JK_LB_STATE_PROBE - * Note: state <= JK_LB_STATE_BUSY is equivalent to - * state is none of JK_LB_STATE_ERROR, JK_LB_STATE_PROBE - * Note: activation == JK_LB_ACTIVATION_ACTIVE is equivalent to - * activation is none of JK_LB_ACTIVATION_STOPPED, JK_LB_ACTIVATION_DISABLED - */ -#define JK_WORKER_USABLE(s, activation) ((s) <= JK_LB_STATE_FORCE && activation == JK_LB_ACTIVATION_ACTIVE) -#define JK_WORKER_USABLE_STICKY(s, activation) ((s) <= JK_LB_STATE_BUSY && activation != JK_LB_ACTIVATION_STOPPED) - -static const char *lb_locking_type[] = { - JK_LB_LOCK_TEXT_OPTIMISTIC, - JK_LB_LOCK_TEXT_PESSIMISTIC, - "unknown", - NULL -}; - -static const char *lb_method_type[] = { - JK_LB_METHOD_TEXT_REQUESTS, - JK_LB_METHOD_TEXT_TRAFFIC, - JK_LB_METHOD_TEXT_BUSYNESS, - JK_LB_METHOD_TEXT_SESSIONS, - "unknown", - NULL -}; - -static const char *lb_state_type[] = { - JK_LB_STATE_TEXT_IDLE, - JK_LB_STATE_TEXT_OK, - JK_LB_STATE_TEXT_RECOVER, - JK_LB_STATE_TEXT_FORCE, - JK_LB_STATE_TEXT_BUSY, - JK_LB_STATE_TEXT_ERROR, - JK_LB_STATE_TEXT_PROBE, - "unknown", - NULL -}; - -static const char *lb_activation_type[] = { - JK_LB_ACTIVATION_TEXT_ACTIVE, - JK_LB_ACTIVATION_TEXT_DISABLED, - JK_LB_ACTIVATION_TEXT_STOPPED, - "unknown", - NULL -}; - -static const char *lb_first_log_names[] = { - JK_NOTE_LB_FIRST_NAME, - JK_NOTE_LB_FIRST_VALUE, - JK_NOTE_LB_FIRST_ACCESSED, - JK_NOTE_LB_FIRST_READ, - JK_NOTE_LB_FIRST_TRANSFERRED, - JK_NOTE_LB_FIRST_ERRORS, - JK_NOTE_LB_FIRST_BUSY, - JK_NOTE_LB_FIRST_ACTIVATION, - JK_NOTE_LB_FIRST_STATE, - NULL -}; - -static const char *lb_last_log_names[] = { - JK_NOTE_LB_LAST_NAME, - JK_NOTE_LB_LAST_VALUE, - JK_NOTE_LB_LAST_ACCESSED, - JK_NOTE_LB_LAST_READ, - JK_NOTE_LB_LAST_TRANSFERRED, - JK_NOTE_LB_LAST_ERRORS, - JK_NOTE_LB_LAST_BUSY, - JK_NOTE_LB_LAST_ACTIVATION, - JK_NOTE_LB_LAST_STATE, - NULL -}; - -struct lb_endpoint -{ - lb_worker_t *worker; - jk_endpoint_t endpoint; - int *states; -}; -typedef struct lb_endpoint lb_endpoint_t; - - -/* Calculate the greatest common divisor of two positive integers */ -static jk_uint64_t gcd(jk_uint64_t a, jk_uint64_t b) -{ - jk_uint64_t r; - if (b > a) { - r = a; - a = b; - b = r; - } - while (b > 0) { - r = a % b; - a = b; - b = r; - } - return a; -} - -/* Calculate the smallest common multiple of two positive integers */ -static jk_uint64_t scm(jk_uint64_t a, jk_uint64_t b) -{ - return a * b / gcd(a, b); -} - -/* Return the string representation of the lb lock type */ -const char *jk_lb_get_lock(lb_worker_t *p, jk_logger_t *l) -{ - return lb_locking_type[p->lblock]; -} - -/* Return the int representation of the lb lock type */ -int jk_lb_get_lock_code(const char *v) -{ - if (!v) - return JK_LB_LOCK_DEF; - else if (*v == 'o' || *v == 'O' || *v == '0') - return JK_LB_LOCK_OPTIMISTIC; - else if (*v == 'p' || *v == 'P' || *v == '1') - return JK_LB_LOCK_PESSIMISTIC; - else - return JK_LB_LOCK_DEF; -} - -/* Return the string representation of the lb method type */ -const char *jk_lb_get_method(lb_worker_t *p, jk_logger_t *l) -{ - return lb_method_type[p->lbmethod]; -} - -/* Return the int representation of the lb method type */ -int jk_lb_get_method_code(const char *v) -{ - if (!v) - return JK_LB_METHOD_DEF; - else if (*v == 'r' || *v == 'R' || *v == '0') - return JK_LB_METHOD_REQUESTS; - else if (*v == 't' || *v == 'T' || *v == '1') - return JK_LB_METHOD_TRAFFIC; - else if (*v == 'b' || *v == 'B' || *v == '2') - return JK_LB_METHOD_BUSYNESS; - else if (*v == 's' || *v == 'S' || *v == '3') - return JK_LB_METHOD_SESSIONS; - else - return JK_LB_METHOD_DEF; -} - -/* Return the string representation of the balance worker state */ -const char *jk_lb_get_state(lb_sub_worker_t *p, jk_logger_t *l) -{ - return lb_state_type[p->s->state]; -} - -/* Return the int representation of the lb state */ -int jk_lb_get_state_code(const char *v) -{ - if (!v) - return JK_LB_STATE_DEF; - else if (*v == 'i' || *v == 'I' || *v == 'n' || *v == 'N' || *v == '0') - return JK_LB_STATE_IDLE; - else if (*v == 'o' || *v == 'O' || *v == '1') - return JK_LB_STATE_OK; - else if (*v == 'r' || *v == 'R' || *v == '2') - return JK_LB_STATE_RECOVER; - else if (*v == 'f' || *v == 'F' || *v == '3') - return JK_LB_STATE_FORCE; - else if (*v == 'b' || *v == 'B' || *v == '4') - return JK_LB_STATE_BUSY; - else if (*v == 'e' || *v == 'E' || *v == '5') - return JK_LB_STATE_ERROR; - else if (*v == 'p' || *v == 'P' || *v == '6') - return JK_LB_STATE_PROBE; - else - return JK_LB_STATE_DEF; -} - -/* Return the string representation of the balance worker activation */ -/* based on the integer representation */ -const char *jk_lb_get_activation_direct(int activation, jk_logger_t *l) -{ - return lb_activation_type[activation]; -} - -/* Return the string representation of the balance worker activation */ -/* based on the sub worker struct */ -const char *jk_lb_get_activation(lb_sub_worker_t *p, jk_logger_t *l) -{ - return lb_activation_type[p->activation]; -} - -int jk_lb_get_activation_code(const char *v) -{ - if (!v) - return JK_LB_ACTIVATION_DEF; - else if (*v == 'a' || *v == 'A' || *v == '0') - return JK_LB_ACTIVATION_ACTIVE; - else if (*v == 'd' || *v == 'D' || *v == '1') - return JK_LB_ACTIVATION_DISABLED; - else if (*v == 's' || *v == 'S' || *v == '2') - return JK_LB_ACTIVATION_STOPPED; - else - return JK_LB_ACTIVATION_DEF; -} - -/* Update the load multipliers wrt. lb_factor */ -void update_mult(lb_worker_t *p, jk_logger_t *l) -{ - unsigned int i = 0; - jk_uint64_t s = 1; - JK_TRACE_ENTER(l); - for (i = 0; i < p->num_of_workers; i++) { - s = scm(s, p->lb_workers[i].lb_factor); - } - for (i = 0; i < p->num_of_workers; i++) { - p->lb_workers[i].lb_mult = s / p->lb_workers[i].lb_factor; - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "worker %s gets multiplicity %" - JK_UINT64_T_FMT, - p->lb_workers[i].name, - p->lb_workers[i].lb_mult); - } - JK_TRACE_EXIT(l); -} - -/* Reset all lb values. - */ -void reset_lb_values(lb_worker_t *p, jk_logger_t *l) -{ - unsigned int i = 0; - JK_TRACE_ENTER(l); - if (p->lbmethod != JK_LB_METHOD_BUSYNESS) { - for (i = 0; i < p->num_of_workers; i++) { - p->lb_workers[i].s->lb_value = 0; - } - } - JK_TRACE_EXIT(l); -} - -/* Syncing config values from shm */ -void jk_lb_pull(lb_worker_t *p, int locked, jk_logger_t *l) -{ - unsigned int i = 0; - - JK_TRACE_ENTER(l); - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "syncing mem for lb '%s' from shm (%u->%u)", - p->name, p->sequence, p->s->h.sequence); - if (locked == JK_FALSE) - jk_shm_lock(); - p->sticky_session = p->s->sticky_session; - p->sticky_session_force = p->s->sticky_session_force; - p->recover_wait_time = p->s->recover_wait_time; - p->error_escalation_time = p->s->error_escalation_time; - p->max_reply_timeouts = p->s->max_reply_timeouts; - p->retries = p->s->retries; - p->retry_interval = p->s->retry_interval; - p->lbmethod = p->s->lbmethod; - p->lblock = p->s->lblock; - p->max_packet_size = p->s->max_packet_size; - p->sequence = p->s->h.sequence; - strncpy(p->session_cookie, p->s->session_cookie, JK_SHM_STR_SIZ); - strncpy(p->session_path, p->s->session_path, JK_SHM_STR_SIZ); - - for (i = 0; i < p->num_of_workers; i++) { - lb_sub_worker_t *w = &p->lb_workers[i]; - if (w->sequence != w->s->h.sequence) { - jk_worker_t *jw = w->worker; - ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private; - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "syncing mem for member '%s' of lb '%s' from shm", - w->name, p->name); - - jk_ajp_pull(aw, JK_TRUE, l); - strncpy(w->route, w->s->route, JK_SHM_STR_SIZ); - strncpy(w->domain, w->s->domain, JK_SHM_STR_SIZ); - strncpy(w->redirect, w->s->redirect, JK_SHM_STR_SIZ); - w->distance = w->s->distance; - w->activation = w->s->activation; - w->lb_factor = w->s->lb_factor; - w->lb_mult = w->s->lb_mult; - w->sequence = w->s->h.sequence; - } - } - if (locked == JK_FALSE) - jk_shm_unlock(); - - JK_TRACE_EXIT(l); -} - -/* Syncing config values to shm */ -void jk_lb_push(lb_worker_t *p, int locked, jk_logger_t *l) -{ - unsigned int i = 0; - - JK_TRACE_ENTER(l); - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "syncing shm for lb '%s' from mem (%u->%u)", - p->name, p->s->h.sequence, p->sequence); - if (locked == JK_FALSE) - jk_shm_lock(); - p->s->sticky_session = p->sticky_session; - p->s->sticky_session_force = p->sticky_session_force; - p->s->recover_wait_time = p->recover_wait_time; - p->s->error_escalation_time = p->error_escalation_time; - p->s->max_reply_timeouts = p->max_reply_timeouts; - p->s->retries = p->retries; - p->s->retry_interval = p->retry_interval; - p->s->lbmethod = p->lbmethod; - p->s->lblock = p->lblock; - p->s->max_packet_size = p->max_packet_size; - p->s->h.sequence = p->sequence; - strncpy(p->s->session_cookie, p->session_cookie, JK_SHM_STR_SIZ); - strncpy(p->s->session_path, p->session_path, JK_SHM_STR_SIZ); - - for (i = 0; i < p->num_of_workers; i++) { - lb_sub_worker_t *w = &p->lb_workers[i]; - if (w->sequence != w->s->h.sequence) { - jk_worker_t *jw = w->worker; - ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private; - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "syncing shm for member '%s' of lb '%s' from mem", - w->name, p->name); - - jk_ajp_push(aw, JK_TRUE, l); - strncpy(w->s->route, w->route, JK_SHM_STR_SIZ); - strncpy(w->s->domain, w->domain, JK_SHM_STR_SIZ); - strncpy(w->s->redirect, w->redirect, JK_SHM_STR_SIZ); - w->s->distance = w->distance; - w->s->activation = w->activation; - w->s->lb_factor = w->lb_factor; - w->s->lb_mult = w->lb_mult; - w->s->h.sequence = w->sequence; - } - } - if (locked == JK_FALSE) - jk_shm_unlock(); - - JK_TRACE_EXIT(l); -} - -/* Retrieve the parameter with the given name */ -static char *get_path_param(jk_ws_service_t *s, const char *name) -{ - char *id_start = NULL; - for (id_start = strstr(s->req_uri, name); - id_start; id_start = strstr(id_start + 1, name)) { - if (id_start[strlen(name)] == '=') { - /* - * Session path-cookie was found, get it's value - */ - id_start += (1 + strlen(name)); - if (strlen(id_start)) { - char *id_end; - id_start = jk_pool_strdup(s->pool, id_start); - /* - * The query string is not part of req_uri, however - * to be on the safe side lets remove the trailing query - * string if appended... - */ - if ((id_end = strchr(id_start, '?')) != NULL) { - *id_end = '\0'; - } - /* - * Remove any trailing path element. - */ - if ((id_end = strchr(id_start, ';')) != NULL) { - *id_end = '\0'; - } - return id_start; - } - } - } - - return NULL; -} - -/* Retrieve the cookie with the given name */ -static char *get_cookie(jk_ws_service_t *s, const char *name) -{ - unsigned i; - char *result = NULL; - - for (i = 0; i < s->num_headers; i++) { - if (strcasecmp(s->headers_names[i], "cookie") == 0) { - - char *id_start; - for (id_start = strstr(s->headers_values[i], name); - id_start; id_start = strstr(id_start + 1, name)) { - if (id_start == s->headers_values[i] || - id_start[-1] == ';' || - id_start[-1] == ',' || isspace((int)id_start[-1])) { - id_start += strlen(name); - while (*id_start && isspace((int)(*id_start))) - ++id_start; - if (*id_start == '=' && id_start[1]) { - /* - * Session cookie was found, get it's value - */ - char *id_end; - size_t sz; - ++id_start; - if ((id_end = strpbrk(id_start, ";,")) != NULL) - sz = id_end - id_start; - else { - sz = strlen(id_start); - id_end = id_start + sz; - } - if (result == NULL) { - result = jk_pool_alloc(s->pool, sz + 1); - memcpy(result, id_start, sz); - result[sz] = '\0'; - } - else { - size_t osz = strlen(result) + 1; - result = - jk_pool_realloc(s->pool, osz + sz + 1, result, osz); - strcat(result, ";"); - strncat(result, id_start, sz); - } - id_start = id_end; - } - } - } - } - } - - return result; -} - - -/* Retrieve session id from the cookie or the parameter - * (parameter first) - */ -static char *get_sessionid(jk_ws_service_t *s, lb_worker_t *p, jk_logger_t *l) -{ - char *val; - val = get_path_param(s, p->session_path); - if (!val) { - val = get_cookie(s, p->session_cookie); - } - if (val && !*val) { - /* TODO: For now only log the empty sessions. - * However we should probably return 400 - * (BAD_REQUEST) in this case - */ - jk_log(l, JK_LOG_INFO, - "Detected empty session identifier."); - return NULL; - } - return val; -} - -static void close_workers(lb_worker_t *p, int num_of_workers, jk_logger_t *l) -{ - int i = 0; - for (i = 0; i < num_of_workers; i++) { - p->lb_workers[i].worker->destroy(&(p->lb_workers[i].worker), l); - } -} - -/* If the worker is in error state run - * retry on that worker. It will be marked as - * operational if the retry timeout is elapsed. - * The worker might still be unusable, but we try - * anyway. - * If the worker is in ok state and got no requests - * since the last global maintenance, we mark its - * state as not available. - * Return the number of workers not in error state. - */ -static int recover_workers(lb_worker_t *p, - jk_uint64_t curmax, - time_t now, - jk_logger_t *l) -{ - unsigned int i; - int non_error = 0; - int elapsed; - lb_sub_worker_t *w = NULL; - ajp_worker_t *aw = NULL; - JK_TRACE_ENTER(l); - - if (p->sequence != p->s->h.sequence) - jk_lb_pull(p, JK_TRUE, l); - for (i = 0; i < p->num_of_workers; i++) { - w = &p->lb_workers[i]; - aw = (ajp_worker_t *)w->worker->worker_private; - if (w->s->state == JK_LB_STATE_ERROR) { - elapsed = (int)difftime(now, w->s->error_time); - if (elapsed <= p->recover_wait_time) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "worker %s will recover in %d seconds", - w->name, p->recover_wait_time - elapsed); - } - else { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "worker %s is marked for recovery", - w->name); - if (p->lbmethod != JK_LB_METHOD_BUSYNESS) - w->s->lb_value = curmax; - aw->s->reply_timeouts = 0; - w->s->state = JK_LB_STATE_RECOVER; - non_error++; - } - } - else if (w->s->error_time > 0 && - (int)difftime(now, w->s->error_time) >= p->error_escalation_time) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "worker %s escalating local error to global error", - w->name); - w->s->state = JK_LB_STATE_ERROR; - } - else { - non_error++; - if (w->s->state == JK_LB_STATE_OK && - aw->s->used == w->s->elected_snapshot) - w->s->state = JK_LB_STATE_IDLE; - } - w->s->elected_snapshot = aw->s->used; - } - - JK_TRACE_EXIT(l); - return non_error; -} - -static int force_recovery(lb_worker_t *p, - int *states, - jk_logger_t *l) -{ - unsigned int i; - int forced = 0; - lb_sub_worker_t *w = NULL; - ajp_worker_t *aw = NULL; - JK_TRACE_ENTER(l); - - for (i = 0; i < p->num_of_workers; i++) { - w = &p->lb_workers[i]; - if (w->s->state == JK_LB_STATE_ERROR) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_INFO, - "worker %s is marked for forced recovery", - w->name); - aw = (ajp_worker_t *)w->worker->worker_private; - aw->s->reply_timeouts = 0; - w->s->state = JK_LB_STATE_FORCE; - if (states != NULL) - states[i] = JK_LB_STATE_FORCE; - forced++; - } - } - - JK_TRACE_EXIT(l); - return forced; -} - -/* Divide old load values by the decay factor, - * such that older values get less important - * for the routing decisions. - */ -static jk_uint64_t decay_load(lb_worker_t *p, - time_t exponent, - jk_logger_t *l) -{ - unsigned int i; - jk_uint64_t curmax = 0; - lb_sub_worker_t *w; - ajp_worker_t *aw; - - JK_TRACE_ENTER(l); - for (i = 0; i < p->num_of_workers; i++) { - w = &p->lb_workers[i]; - if (p->lbmethod != JK_LB_METHOD_BUSYNESS) { - w->s->lb_value >>= exponent; - if (w->s->lb_value > curmax) { - curmax = w->s->lb_value; - } - } - aw = (ajp_worker_t *)w->worker->worker_private; - aw->s->reply_timeouts >>= exponent; - } - JK_TRACE_EXIT(l); - return curmax; -} - -static int JK_METHOD maintain_workers(jk_worker_t *p, time_t now, jk_logger_t *l) -{ - unsigned int i = 0; - jk_uint64_t curmax = 0; - long delta; - - JK_TRACE_ENTER(l); - if (p && p->worker_private) { - lb_worker_t *lb = (lb_worker_t *)p->worker_private; - - for (i = 0; i < lb->num_of_workers; i++) { - if (lb->lb_workers[i].worker->maintain) { - lb->lb_workers[i].worker->maintain(lb->lb_workers[i].worker, now, l); - } - } - - jk_shm_lock(); - - /* Now we check for global maintenance (once for all processes). - * Checking workers for recovery and applying decay to the - * load values should not be done by each process individually. - * Therefore we globally sync and we use a global timestamp. - * Since it's possible that we come here a few milliseconds - * before the interval has passed, we allow a little tolerance. - */ - delta = (long)difftime(now, lb->s->last_maintain_time) + JK_LB_MAINTAIN_TOLERANCE; - if (delta >= lb->maintain_time) { - lb->s->last_maintain_time = now; - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "decay with 2^%d", - JK_LB_DECAY_MULT * delta / lb->maintain_time); - curmax = decay_load(lb, JK_LB_DECAY_MULT * delta / lb->maintain_time, l); - if (!recover_workers(lb, curmax, now, l)) { - force_recovery(lb, NULL, l); - } - } - - jk_shm_unlock(); - - } - else { - JK_LOG_NULL_PARAMS(l); - } - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -static int find_by_session(jk_ws_service_t *s, - lb_worker_t *p, - const char *session_route, - jk_logger_t *l) -{ - - int rc = -1; - unsigned int i; - - for (i = 0; i < p->num_of_workers; i++) { - if (strcmp(p->lb_workers[i].route, session_route) == 0) { - rc = i; - break; - } - } - return rc; -} - -static int find_best_bydomain(jk_ws_service_t *s, - lb_worker_t *p, - const char *route_or_domain, - int *states, - jk_logger_t *l) -{ - unsigned int i; - int d = 0; - jk_uint64_t curmin = 0; - int candidate = -1; - int activation; - lb_sub_worker_t wr; - char *idpart = strchr(route_or_domain, '.'); - size_t domain_len = 0; - - if (idpart) { - domain_len = idpart - route_or_domain; - } - else { - domain_len = strlen(route_or_domain); - } - /* First try to see if we have available candidate */ - for (i = 0; i < p->num_of_workers; i++) { - /* Skip all workers that are not member of domain */ - wr = p->lb_workers[i]; - if (strlen(wr.domain) == 0 || - strlen(wr.domain) != domain_len || - strncmp(wr.domain, route_or_domain, domain_len)) - continue; - /* Take into calculation only the workers that are - * not in error state, stopped, disabled or busy. - */ - activation = s->extension.activation ? - s->extension.activation[i] : - JK_LB_ACTIVATION_UNSET; - if (activation == JK_LB_ACTIVATION_UNSET) - activation = wr.activation; - if (JK_WORKER_USABLE(states[wr.i], activation)) { - if (candidate < 0 || wr.distance < d || - (wr.s->lb_value < curmin && - wr.distance == d)) { - candidate = i; - curmin = wr.s->lb_value; - d = wr.distance; - } - } - } - return candidate; -} - - -static int find_best_byvalue(jk_ws_service_t *s, - lb_worker_t *p, - int *states, - jk_logger_t *l) -{ - unsigned int i; - unsigned int j; - unsigned int offset; - int d = 0; - jk_uint64_t curmin = 0; - - /* find the least busy worker */ - int candidate = -1; - int activation; - lb_sub_worker_t wr; - - offset = p->next_offset; - - /* First try to see if we have available candidate */ - for (j = offset; j < p->num_of_workers + offset; j++) { - i = j % p->num_of_workers; - wr = p->lb_workers[i]; - activation = s->extension.activation ? - s->extension.activation[i] : - JK_LB_ACTIVATION_UNSET; - if (activation == JK_LB_ACTIVATION_UNSET) - activation = wr.activation; - - /* Take into calculation only the workers that are - * not in error state, stopped, disabled or busy. - */ - if (JK_WORKER_USABLE(states[wr.i], activation)) { - if (candidate < 0 || wr.distance < d || - (wr.s->lb_value < curmin && - wr.distance == d)) { - candidate = i; - curmin = wr.s->lb_value; - d = wr.distance; - p->next_offset = i + 1; - } - } - } - return candidate; -} - -static int find_bysession_route(jk_ws_service_t *s, - lb_worker_t *p, - const char *session_route, - int *states, - jk_logger_t *l) -{ - int uses_domain = 0; - int candidate = -1; - - candidate = find_by_session(s, p, session_route, l); - if (candidate < 0) { - uses_domain = 1; - candidate = find_best_bydomain(s, p, session_route, states, l); - } - if (candidate >= 0) { - lb_sub_worker_t wr = p->lb_workers[candidate]; - int activation; - if (uses_domain) - s->route = wr.domain; - activation = s->extension.activation ? - s->extension.activation[candidate] : - JK_LB_ACTIVATION_UNSET; - if (activation == JK_LB_ACTIVATION_UNSET) - activation = wr.activation; - if (!JK_WORKER_USABLE_STICKY(states[wr.i], activation)) { - /* We have a worker that is error state or stopped. - * If it has a redirection set use that redirection worker. - * This enables to safely remove the member from the - * balancer. Of course you will need a some kind of - * session replication between those two remote. - */ - if (p->sticky_session_force) - candidate = -1; - else if (*wr.redirect) { - candidate = find_by_session(s, p, wr.redirect, l); - s->route = NULL; - } - else if (*wr.domain && !uses_domain) { - candidate = find_best_bydomain(s, p, wr.domain, states, l); - if (candidate >= 0) { - s->route = wr.domain; - } else { - s->route = NULL; - } - } - if (candidate >= 0) { - wr = p->lb_workers[candidate]; - activation = s->extension.activation ? - s->extension.activation[candidate] : - JK_LB_ACTIVATION_UNSET; - if (activation == JK_LB_ACTIVATION_UNSET) - activation = wr.activation; - if (!JK_WORKER_USABLE_STICKY(states[wr.i], activation)) - candidate = -1; - } - } - } - return candidate; -} - -static int find_failover_worker(jk_ws_service_t *s, - lb_worker_t *p, - int *states, - jk_logger_t *l) -{ - int rc = -1; - unsigned int i; - char *redirect = NULL; - - for (i = 0; i < p->num_of_workers; i++) { - if (strlen(p->lb_workers[i].redirect)) { - redirect = p->lb_workers[i].redirect; - break; - } - } - if (redirect) - rc = find_bysession_route(s, p, redirect, states, l); - return rc; -} - -static int find_best_worker(jk_ws_service_t *s, - lb_worker_t *p, - int *states, - jk_logger_t *l) -{ - int rc = -1; - - rc = find_best_byvalue(s, p, states, l); - /* By default use worker route as session route */ - if (rc < 0) - rc = find_failover_worker(s, p, states, l); - return rc; -} - -static int get_most_suitable_worker(jk_ws_service_t *s, - lb_worker_t *p, - char *sessionid, - int *states, - jk_logger_t *l) -{ - int rc = -1; - int r; - - JK_TRACE_ENTER(l); - if (p->num_of_workers == 1) { - /* No need to find the best worker - * if there is a single one - */ - int activation = s->extension.activation ? - s->extension.activation[0] : - JK_LB_ACTIVATION_UNSET; - if (activation == JK_LB_ACTIVATION_UNSET) - activation = p->lb_workers[0].activation; - if (JK_WORKER_USABLE_STICKY(states[0], activation)) { - if (activation != JK_LB_ACTIVATION_DISABLED) { - JK_TRACE_EXIT(l); - return 0; - } - } - else { - JK_TRACE_EXIT(l); - return -1; - } - } - if (p->lblock == JK_LB_LOCK_PESSIMISTIC) - r = jk_shm_lock(); - else { - JK_ENTER_CS(&(p->cs), r); - } - if (!r) { - jk_log(l, JK_LOG_ERROR, - "locking failed (errno=%d)", - errno); - } - if (sessionid) { - char *session = sessionid; - while (sessionid) { - char *next = strchr(sessionid, ';'); - char *session_route = NULL; - if (next) - *next++ = '\0'; - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "searching worker for partial sessionid %s", - sessionid); - session_route = strchr(sessionid, '.'); - if (session_route) { - ++session_route; - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "searching worker for session route %s", - session_route); - - /* We have a session route. Whow! */ - rc = find_bysession_route(s, p, session_route, states, l); - if (rc >= 0) { - lb_sub_worker_t *wr = &(p->lb_workers[rc]); - if (p->lblock == JK_LB_LOCK_PESSIMISTIC) - jk_shm_unlock(); - else { - JK_LEAVE_CS(&(p->cs), r); - } - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "found worker %s (%s) for route %s and partial sessionid %s", - wr->name, wr->route, session_route, sessionid); - JK_TRACE_EXIT(l); - return rc; - } - } - /* Try next partial sessionid if present */ - sessionid = next; - rc = -1; - } - if (rc < 0 && p->sticky_session_force) { - if (p->lblock == JK_LB_LOCK_PESSIMISTIC) - jk_shm_unlock(); - else { - JK_LEAVE_CS(&(p->cs), r); - } - jk_log(l, JK_LOG_INFO, - "all workers are in error state for session %s", - session); - JK_TRACE_EXIT(l); - return -1; - } - } - rc = find_best_worker(s, p, states, l); - if (p->lblock == JK_LB_LOCK_PESSIMISTIC) - jk_shm_unlock(); - else { - JK_LEAVE_CS(&(p->cs), r); - } - if (rc >= 0) { - lb_sub_worker_t *wr = &(p->lb_workers[rc]); - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "found best worker %s (%s) using method '%s'", - wr->name, wr->route, jk_lb_get_method(p, l)); - JK_TRACE_EXIT(l); - return rc; - } - JK_TRACE_EXIT(l); - return -1; -} - -static void lb_add_log_items(jk_ws_service_t *s, - const char *const *log_names, - lb_sub_worker_t *w, - jk_logger_t *l) -{ - ajp_worker_t *aw = (ajp_worker_t *)w->worker->worker_private; - const char **log_values = jk_pool_alloc(s->pool, sizeof(char *) * JK_LB_NOTES_COUNT); - char *buf = jk_pool_alloc(s->pool, sizeof(char *) * JK_LB_NOTES_COUNT * JK_LB_UINT64_STR_SZ); - if (log_values && buf) { - /* JK_NOTE_LB_FIRST/LAST_NAME */ - log_values[0] = w->name; - snprintf(buf, JK_LB_UINT64_STR_SZ, "%" JK_UINT64_T_FMT, w->s->lb_value); - /* JK_NOTE_LB_FIRST/LAST_VALUE */ - log_values[1] = buf; - buf += JK_LB_UINT64_STR_SZ; - snprintf(buf, JK_LB_UINT64_STR_SZ, "%" JK_UINT64_T_FMT, aw->s->used); - /* JK_NOTE_LB_FIRST/LAST_ACCESSED */ - log_values[2] = buf; - buf += JK_LB_UINT64_STR_SZ; - snprintf(buf, JK_LB_UINT64_STR_SZ, "%" JK_UINT64_T_FMT, aw->s->readed); - /* JK_NOTE_LB_FIRST/LAST_READ */ - log_values[3] = buf; - buf += JK_LB_UINT64_STR_SZ; - snprintf(buf, JK_LB_UINT64_STR_SZ, "%" JK_UINT64_T_FMT, aw->s->transferred); - /* JK_NOTE_LB_FIRST/LAST_TRANSFERRED */ - log_values[4] = buf; - buf += JK_LB_UINT64_STR_SZ; - snprintf(buf, JK_LB_UINT64_STR_SZ, "%" JK_UINT32_T_FMT, w->s->errors); - /* JK_NOTE_LB_FIRST/LAST_ERRORS */ - log_values[5] = buf; - buf += JK_LB_UINT64_STR_SZ; - snprintf(buf, JK_LB_UINT64_STR_SZ, "%d", aw->s->busy); - /* JK_NOTE_LB_FIRST/LAST_BUSY */ - log_values[6] = buf; - /* JK_NOTE_LB_FIRST/LAST_ACTIVATION */ - log_values[7] = jk_lb_get_activation(w, l); - /* JK_NOTE_LB_FIRST/LAST_STATE */ - log_values[8] = jk_lb_get_state(w, l); - s->add_log_items(s, log_names, log_values, JK_LB_NOTES_COUNT); - } -} - -static int JK_METHOD service(jk_endpoint_t *e, - jk_ws_service_t *s, - jk_logger_t *l, int *is_error) -{ - lb_endpoint_t *p; - int attempt = 0; - lb_sub_worker_t *prec = NULL; - int num_of_workers; - int first = 1; - int was_forced = 0; - int recoverable = JK_TRUE; - int rc = JK_UNSET; - char *sessionid = NULL; - int i; - int retry = 0; - - JK_TRACE_ENTER(l); - - if (!e || !e->endpoint_private || !s || !is_error) { - JK_LOG_NULL_PARAMS(l); - if (is_error) - *is_error = JK_HTTP_SERVER_ERROR; - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - p = e->endpoint_private; - num_of_workers = p->worker->num_of_workers; - - /* Set returned error to OK */ - *is_error = JK_HTTP_OK; - - if (p->worker->sequence != p->worker->s->h.sequence) - jk_lb_pull(p->worker, JK_FALSE, l); - for (i = 0; i < num_of_workers; i++) { - lb_sub_worker_t *rec = &(p->worker->lb_workers[i]); - if (rec->s->state == JK_LB_STATE_BUSY) { - if (ajp_has_endpoint(rec->worker, l)) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "worker %s busy count fixed", - rec->name); - rec->s->state = JK_LB_STATE_OK; - } - } - /* Copy the shared state info */ - p->states[i] = rec->s->state; - } - - /* set the recovery post, for LB mode */ - s->reco_buf = jk_b_new(s->pool); - if (!s->reco_buf) { - *is_error = JK_HTTP_SERVER_ERROR; - jk_log(l, JK_LOG_ERROR, - "Failed allocating AJP message"); - JK_TRACE_EXIT(l); - return JK_SERVER_ERROR; - } - if (jk_b_set_buffer_size(s->reco_buf, p->worker->max_packet_size)) { - *is_error = JK_HTTP_SERVER_ERROR; - jk_log(l, JK_LOG_ERROR, - "Failed allocating AJP message buffer"); - JK_TRACE_EXIT(l); - return JK_SERVER_ERROR; - } - jk_b_reset(s->reco_buf); - s->reco_status = RECO_INITED; - - if (p->worker->sticky_session) { - /* Use sessionid only if sticky_session is - * defined for this load balancer - */ - sessionid = get_sessionid(s, p->worker, l); - } - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "service sticky_session=%d id='%s'", - p->worker->sticky_session, sessionid ? sessionid : "empty"); - - while (recoverable == JK_TRUE) { - if (attempt >= num_of_workers) { - retry++; - if (retry >= p->worker->retries) { - /* Done with retrying */ - break; - } - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "retry %d, sleeping for %d ms before retrying", - retry, p->worker->retry_interval); - jk_sleep(p->worker->retry_interval); - /* Pull shared memory if something changed during sleep */ - if (p->worker->sequence != p->worker->s->h.sequence) - jk_lb_pull(p->worker, JK_FALSE, l); - for (i = 0; i < num_of_workers; i++) { - /* Copy the shared state info */ - p->states[i] = p->worker->lb_workers[i].s->state; - } - attempt = 0; - } - rc = JK_FALSE; - *is_error = JK_HTTP_SERVER_BUSY; - i = get_most_suitable_worker(s, p->worker, sessionid, p->states, l); - if (i >= 0) { - int r; - int is_service_error = JK_HTTP_OK; - lb_sub_worker_t *rec = &(p->worker->lb_workers[i]); - ajp_worker_t *aw = (ajp_worker_t *)rec->worker->worker_private; - jk_endpoint_t *end = NULL; - int activation = s->extension.activation ? - s->extension.activation[i] : - JK_LB_ACTIVATION_UNSET; - if (activation == JK_LB_ACTIVATION_UNSET) - activation = rec->activation; - if (!s->route) - s->route = rec->route; - s->activation = jk_lb_get_activation_direct(activation, l); - prec = rec; - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "service worker=%s route=%s", - rec->name, s->route); - - if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC) - jk_shm_lock(); - if (rec->s->state == JK_LB_STATE_RECOVER) { - rec->s->state = JK_LB_STATE_PROBE; - p->states[rec->i] = JK_LB_STATE_PROBE; - } - if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC) - jk_shm_unlock(); - - r = rec->worker->get_endpoint(rec->worker, &end, l); - if (!r || !end) { - /* If we can not get the endpoint - * mark the worker as busy rather then - * as in error if the retry number is - * greater then the number of retries. - */ - if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC) - jk_shm_lock(); - if (rec->s->state != JK_LB_STATE_ERROR) { - rec->s->state = JK_LB_STATE_BUSY; - p->states[rec->i] = JK_LB_STATE_BUSY; - } - if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC) - jk_shm_unlock(); - jk_log(l, JK_LOG_INFO, - "could not get free endpoint for worker %s (%d retries)", - rec->name, retry); - } - else { - int service_stat = JK_UNSET; - jk_uint64_t rd = 0; - jk_uint64_t wr = 0; - /* Reset endpoint read and write sizes for - * this request. - */ - end->rd = end->wr = 0; - end->recoverable = JK_TRUE; - if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC) - jk_shm_lock(); - - /* Increment the number of workers serving request */ - p->worker->s->busy++; - rec->s->busy++; - if (p->worker->s->busy > p->worker->s->max_busy) - p->worker->s->max_busy = p->worker->s->busy; - if ( (p->worker->lbmethod == JK_LB_METHOD_REQUESTS) || - (p->worker->lbmethod == JK_LB_METHOD_BUSYNESS) || - (p->worker->lbmethod == JK_LB_METHOD_SESSIONS && - !sessionid) ) - rec->s->lb_value += rec->lb_mult; - if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC) - jk_shm_unlock(); - - service_stat = end->service(end, s, l, &is_service_error); - rd = end->rd; - wr = end->wr; - recoverable = end->recoverable; - *is_error = is_service_error; - end->done(&end, l); - - if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC) - jk_shm_lock(); - - /* Update partial reads and writes if any */ - if (p->worker->lbmethod == JK_LB_METHOD_TRAFFIC) { - rec->s->lb_value += (rd+wr)*rec->lb_mult; - } - else if (p->worker->lbmethod == JK_LB_METHOD_BUSYNESS) { - if (rec->s->lb_value >= rec->lb_mult) { - rec->s->lb_value -= rec->lb_mult; - } - else { - rec->s->lb_value = 0; - if (JK_IS_DEBUG_LEVEL(l)) { - jk_log(l, JK_LOG_DEBUG, - "worker %s has load value to low (%" - JK_UINT64_T_FMT - " < %" - JK_UINT64_T_FMT - ") ", - "- correcting to 0", - rec->name, - rec->s->lb_value, - rec->lb_mult); - } - } - } - - /* When have an endpoint and we ran a request, assume - * we are OK, unless we last were in error. - * We will below explicitely set OK or ERROR according - * to the returned service_stat. - */ - if (rec->s->state != JK_LB_STATE_ERROR) { - rec->s->state = JK_LB_STATE_OK; - p->states[rec->i] = JK_LB_STATE_OK; - } - /* Decrement the busy worker count. - * Check if the busy was reset to zero by graceful - * restart of the server. - */ - if (p->worker->s->busy) - p->worker->s->busy--; - if (rec->s->busy) - rec->s->busy--; - if (service_stat == JK_TRUE) { - /* - * Successful request. - */ - rec->s->state = JK_LB_STATE_OK; - p->states[rec->i] = JK_LB_STATE_OK; - rec->s->error_time = 0; - rc = JK_TRUE; - recoverable = JK_UNSET; - } - else if (service_stat == JK_CLIENT_ERROR) { - /* - * Client error !!! - * Since this is bad request do not fail over. - */ - rec->s->state = JK_LB_STATE_OK; - p->states[rec->i] = JK_LB_STATE_ERROR; - rec->s->error_time = 0; - rc = JK_CLIENT_ERROR; - recoverable = JK_FALSE; - } - else if (service_stat == JK_SERVER_ERROR) { - /* - * Internal JK server error. - * Keep previous global state. - * Do not try to reuse the same node for the same request. - * Failing over to another node could help. - */ - p->states[rec->i] = JK_LB_STATE_ERROR; - rc = JK_FALSE; - } - else if (service_stat == JK_AJP_PROTOCOL_ERROR) { - /* - * We've received a bad AJP message from the backend. - * Keep previous global state. - * Do not try to reuse the same node for the same request. - * Failing over to another node could help. - */ - p->states[rec->i] = JK_LB_STATE_ERROR; - rc = JK_FALSE; - } - else if (service_stat == JK_STATUS_ERROR) { - /* - * Status code configured as service is down. - * The node is fine. - * Do not try to reuse the same node for the same request. - * Failing over to another node could help. - */ - rec->s->state = JK_LB_STATE_OK; - p->states[rec->i] = JK_LB_STATE_ERROR; - rec->s->error_time = 0; - rc = JK_FALSE; - } - else if (service_stat == JK_STATUS_FATAL_ERROR) { - /* - * Status code configured as service is down. - * Mark the node as bad. - * Do not try to reuse the same node for the same request. - * Failing over to another node could help. - */ - rec->s->errors++; - rec->s->state = JK_LB_STATE_ERROR; - p->states[rec->i] = JK_LB_STATE_ERROR; - rec->s->error_time = time(NULL); - rc = JK_FALSE; - } - else if (service_stat == JK_REPLY_TIMEOUT) { - if (aw->s->reply_timeouts > (unsigned)p->worker->max_reply_timeouts) { - /* - * Service failed - to many reply timeouts - * Mark the node as bad. - * Do not try to reuse the same node for the same request. - * Failing over to another node could help. - */ - rec->s->errors++; - rec->s->state = JK_LB_STATE_ERROR; - p->states[rec->i] = JK_LB_STATE_ERROR; - rec->s->error_time = time(NULL); - } - else { - /* - * Reply timeout, bot not yet too many of them. - * Keep previous global state. - * Do not try to reuse the same node for the same request. - * Failing over to another node could help. - */ - p->states[rec->i] = JK_LB_STATE_ERROR; - } - rc = JK_FALSE; - } - else { - /* - * Various unspecific error cases. - * Keep previous global state, if we are not in local error since to long. - * Do not try to reuse the same node for the same request. - * Failing over to another node could help. - */ - time_t now = time(NULL); - rec->s->errors++; - if (rec->s->busy == 0 || - p->worker->error_escalation_time == 0 || - (rec->s->error_time > 0 && - (int)difftime(now, rec->s->error_time) >= p->worker->error_escalation_time)) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "worker %s escalating local error to global error", - rec->name); - rec->s->state = JK_LB_STATE_ERROR; - } - p->states[rec->i] = JK_LB_STATE_ERROR; - if (rec->s->error_time == 0) { - rec->s->error_time = now; - } - rc = JK_FALSE; - } - if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC) - jk_shm_unlock(); - if (p->states[rec->i] == JK_LB_STATE_ERROR) - jk_log(l, JK_LOG_INFO, - "service failed, worker %s is in %serror state", - rec->name, - rec->s->state == JK_LB_STATE_ERROR ? "" : "local "); - } - if (recoverable == JK_TRUE) { - /* - * Error is recoverable by submitting the request to - * another worker... Lets try to do that. - */ - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "recoverable error... will try to recover on other worker"); - } - else { - /* - * Error is not recoverable - break with an error. - */ - if (rc == JK_CLIENT_ERROR) - jk_log(l, JK_LOG_INFO, - "unrecoverable error %d, request failed." - " Client failed in the middle of request," - " we can't recover to another instance.", - *is_error); - else if (rc != JK_TRUE) - jk_log(l, JK_LOG_ERROR, - "unrecoverable error %d, request failed." - " Tomcat failed in the middle of request," - " we can't recover to another instance.", - *is_error); - } - if (first == 1 && s->add_log_items) { - first = 0; - lb_add_log_items(s, lb_first_log_names, prec, l); - } - } - else { - /* No more workers left ... */ - if (!was_forced) { - int nf; - /* Force recovery only once. - * If it still fails, Tomcat is still disconnected. - */ - jk_shm_lock(); - nf = force_recovery(p->worker, p->states, l); - jk_shm_unlock(); - was_forced = 1; - if (nf) { - /* We have forced recovery. - * Reset the service loop and go again - */ - prec = NULL; - jk_log(l, JK_LOG_INFO, - "Forcing recovery once for %d workers", nf); - continue; - } - else { - /* No workers in error state. - * Somebody set them all to disabled? - */ - jk_log(l, JK_LOG_INFO, - "All tomcat instances failed, no more workers " - "left for recovery (attempt=%d, retry=%d)", - attempt, retry); - *is_error = JK_HTTP_SERVER_BUSY; - rc = JK_FALSE; - } - } - else { - jk_log(l, JK_LOG_INFO, - "All tomcat instances failed, no more workers " - "left (attempt=%d, retry=%d)", - attempt, retry); - *is_error = JK_HTTP_SERVER_BUSY; - rc = JK_FALSE; - } - } - attempt++; - } - if (recoverable == JK_TRUE) { - jk_log(l, JK_LOG_INFO, - "All tomcat instances are busy or in error state"); - /* rc and http error must be set above */ - } - if (rc == JK_FALSE) { - jk_log(l, JK_LOG_ERROR, - "All tomcat instances failed, no more workers left"); - } - if (prec && s->add_log_items) { - lb_add_log_items(s, lb_last_log_names, prec, l); - } - - JK_TRACE_EXIT(l); - return rc; -} - -static int JK_METHOD done(jk_endpoint_t **e, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - - if (e && *e && (*e)->endpoint_private) { - lb_endpoint_t *p = (*e)->endpoint_private; - free(p->states); - free(p); - *e = NULL; - JK_TRACE_EXIT(l); - return JK_TRUE; - } - - JK_LOG_NULL_PARAMS(l); - JK_TRACE_EXIT(l); - return JK_FALSE; -} - -static int JK_METHOD validate(jk_worker_t *pThis, - jk_map_t *props, - jk_worker_env_t *we, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - - if (pThis && pThis->worker_private) { - lb_worker_t *p = pThis->worker_private; - char **worker_names; - unsigned int num_of_workers; - const char *secret; - - p->sticky_session = jk_get_is_sticky_session(props, p->name); - p->sticky_session_force = jk_get_is_sticky_session_force(props, p->name); - secret = jk_get_worker_secret(props, p->name); - - if (jk_get_lb_worker_list(props, - p->name, - &worker_names, - &num_of_workers) && num_of_workers) { - unsigned int i = 0; - unsigned int j = 0; - p->max_packet_size = DEF_BUFFER_SZ; - p->lb_workers = jk_pool_alloc(&p->p, - num_of_workers * - sizeof(lb_sub_worker_t)); - if (!p->lb_workers) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - memset(p->lb_workers, 0, num_of_workers * sizeof(lb_sub_worker_t)); - for (i = 0; i < num_of_workers; i++) { - p->lb_workers[i].s = jk_shm_alloc_lb_sub_worker(&p->p); - if (p->lb_workers[i].s == NULL) { - jk_log(l, JK_LOG_ERROR, - "allocating lb sub worker record from shared memory"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - - for (i = 0; i < num_of_workers; i++) { - const char *s; - unsigned int ms; - - p->lb_workers[i].i = i; - strncpy(p->lb_workers[i].name, worker_names[i], - JK_SHM_STR_SIZ); - strncpy(p->lb_workers[i].s->h.name, worker_names[i], - JK_SHM_STR_SIZ); - p->lb_workers[i].sequence = 0; - p->lb_workers[i].s->h.sequence = 0; - p->lb_workers[i].lb_factor = - jk_get_lb_factor(props, worker_names[i]); - if (p->lb_workers[i].lb_factor < 1) { - p->lb_workers[i].lb_factor = 1; - } - /* Calculate the maximum packet size from all workers - * for the recovery buffer. - */ - ms = jk_get_max_packet_size(props, worker_names[i]); - if (ms > p->max_packet_size) - p->max_packet_size = ms; - p->lb_workers[i].distance = - jk_get_distance(props, worker_names[i]); - if ((s = jk_get_worker_route(props, worker_names[i], NULL))) - strncpy(p->lb_workers[i].route, s, JK_SHM_STR_SIZ); - else - strncpy(p->lb_workers[i].route, worker_names[i], JK_SHM_STR_SIZ); - if ((s = jk_get_worker_domain(props, worker_names[i], NULL))) - strncpy(p->lb_workers[i].domain, s, JK_SHM_STR_SIZ); - if ((s = jk_get_worker_redirect(props, worker_names[i], NULL))) - strncpy(p->lb_workers[i].redirect, s, JK_SHM_STR_SIZ); - - p->lb_workers[i].s->lb_value = 0; - p->lb_workers[i].s->state = JK_LB_STATE_IDLE; - p->lb_workers[i].s->error_time = 0; - p->lb_workers[i].activation = - jk_get_worker_activation(props, worker_names[i]); - if (!wc_create_worker(p->lb_workers[i].name, 0, - props, - &(p->lb_workers[i].worker), - we, l) || !p->lb_workers[i].worker) { - break; - } - if (secret && (p->lb_workers[i].worker->type == JK_AJP13_WORKER_TYPE || - p->lb_workers[i].worker->type == JK_AJP14_WORKER_TYPE)) { - ajp_worker_t *aw = (ajp_worker_t *)p->lb_workers[i].worker->worker_private; - if (!aw->secret) - aw->secret = secret; - } - if (p->lb_workers[i].worker->type == JK_AJP13_WORKER_TYPE || - p->lb_workers[i].worker->type == JK_AJP14_WORKER_TYPE) { - ajp_worker_t *aw = (ajp_worker_t *)p->lb_workers[i].worker->worker_private; - if (aw->port == 0) { - p->lb_workers[i].activation = JK_LB_ACTIVATION_STOPPED; - } - } - } - - if (i != num_of_workers) { - jk_log(l, JK_LOG_ERROR, - "Failed creating worker %s", - p->lb_workers[i].name); - close_workers(p, i, l); - } - else { - /* Update domain names if route contains period '.' */ - for (i = 0; i < num_of_workers; i++) { - if (!p->lb_workers[i].domain[0]) { - char *id_domain = strchr(p->lb_workers[i].route, '.'); - if (id_domain) { - *id_domain = '\0'; - strcpy(p->lb_workers[i].domain, p->lb_workers[i].route); - *id_domain = '.'; - } - } - if (JK_IS_DEBUG_LEVEL(l)) { - jk_log(l, JK_LOG_DEBUG, - "Balanced worker %i has name %s and route %s in domain %s", - i, - p->lb_workers[i].name, - p->lb_workers[i].route, - p->lb_workers[i].domain); - } - } - p->num_of_workers = num_of_workers; - update_mult(p, l); - for (i = 0; i < num_of_workers; i++) { - for (j = 0; j < i; j++) { - if (strcmp(p->lb_workers[i].route, p->lb_workers[j].route) == 0) { - jk_log(l, JK_LOG_ERROR, - "Balanced workers number %i (%s) and %i (%s) share the same route %s - aborting configuration!", - i, - p->lb_workers[i].name, - j, - p->lb_workers[j].name, - p->lb_workers[i].route); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - } - JK_TRACE_EXIT(l); - return JK_TRUE; - } - } - } - - JK_LOG_NULL_PARAMS(l); - JK_TRACE_EXIT(l); - return JK_FALSE; -} - -static int JK_METHOD init(jk_worker_t *pThis, - jk_map_t *props, - jk_worker_env_t *we, jk_logger_t *log) -{ - int i; - - lb_worker_t *p = (lb_worker_t *)pThis->worker_private; - JK_TRACE_ENTER(log); - - p->worker.we = we; - p->retries = jk_get_worker_retries(props, p->name, - JK_RETRIES); - p->retry_interval = - jk_get_worker_retry_interval(props, p->name, - JK_SLEEP_DEF); - p->recover_wait_time = jk_get_worker_recover_timeout(props, p->name, - WAIT_BEFORE_RECOVER); - if (p->recover_wait_time < 1) - p->recover_wait_time = 1; - p->error_escalation_time = jk_get_worker_error_escalation_time(props, p->name, - p->recover_wait_time / 2); - p->max_reply_timeouts = jk_get_worker_max_reply_timeouts(props, p->name, - 0); - p->maintain_time = jk_get_worker_maintain_time(props); - if(p->maintain_time < 0) - p->maintain_time = 0; - p->s->last_maintain_time = time(NULL); - p->s->last_reset = p->s->last_maintain_time; - - p->lbmethod = jk_get_lb_method(props, p->name); - p->lblock = jk_get_lb_lock(props, p->name); - strncpy(p->session_cookie, - jk_get_lb_session_cookie(props, p->name, JK_SESSION_IDENTIFIER), - JK_SHM_STR_SIZ); - strncpy(p->session_path, - jk_get_lb_session_path(props, p->name, JK_PATH_SESSION_IDENTIFIER), - JK_SHM_STR_SIZ); - strcpy(p->s->session_cookie, p->session_cookie); - strcpy(p->s->session_path, p->session_path); - - JK_INIT_CS(&(p->cs), i); - if (i == JK_FALSE) { - jk_log(log, JK_LOG_ERROR, - "creating thread lock (errno=%d)", - errno); - JK_TRACE_EXIT(log); - return JK_FALSE; - } - - p->sequence++; - jk_lb_push(p, JK_FALSE, log); - - JK_TRACE_EXIT(log); - return JK_TRUE; -} - -static int JK_METHOD get_endpoint(jk_worker_t *pThis, - jk_endpoint_t **pend, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - - if (pThis && pThis->worker_private && pend) { - lb_endpoint_t *p = (lb_endpoint_t *) malloc(sizeof(lb_endpoint_t)); - p->worker = pThis->worker_private; - p->endpoint.endpoint_private = p; - p->endpoint.service = service; - p->endpoint.done = done; - p->states = (int *)malloc((p->worker->num_of_workers + 1) * sizeof(int)); - if (!p->states) { - free(p); - jk_log(l, JK_LOG_ERROR, - "Failed allocating private worker state memory"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - *pend = &p->endpoint; - JK_TRACE_EXIT(l); - return JK_TRUE; - } - else { - JK_LOG_NULL_PARAMS(l); - } - - JK_TRACE_EXIT(l); - return JK_FALSE; -} - -static int JK_METHOD destroy(jk_worker_t **pThis, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - - if (pThis && *pThis && (*pThis)->worker_private) { - unsigned int i; - lb_worker_t *private_data = (*pThis)->worker_private; - - close_workers(private_data, private_data->num_of_workers, l); - JK_DELETE_CS(&(private_data->cs), i); - jk_close_pool(&private_data->p); - free(private_data); - - JK_TRACE_EXIT(l); - return JK_TRUE; - } - - JK_LOG_NULL_PARAMS(l); - JK_TRACE_EXIT(l); - return JK_FALSE; -} - -int JK_METHOD lb_worker_factory(jk_worker_t **w, - const char *name, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - - if (NULL != name && NULL != w) { - lb_worker_t *private_data = - (lb_worker_t *) calloc(1, sizeof(lb_worker_t)); - - - jk_open_pool(&private_data->p, - private_data->buf, - sizeof(jk_pool_atom_t) * TINY_POOL_SIZE); - - private_data->s = jk_shm_alloc_lb_worker(&private_data->p); - if (!private_data->s) { - free(private_data); - JK_TRACE_EXIT(l); - return 0; - } - strncpy(private_data->name, name, JK_SHM_STR_SIZ); - strncpy(private_data->s->h.name, name, JK_SHM_STR_SIZ); - private_data->lb_workers = NULL; - private_data->num_of_workers = 0; - private_data->worker.worker_private = private_data; - private_data->worker.validate = validate; - private_data->worker.init = init; - private_data->worker.get_endpoint = get_endpoint; - private_data->worker.destroy = destroy; - private_data->worker.maintain = maintain_workers; - private_data->recover_wait_time = WAIT_BEFORE_RECOVER; - private_data->error_escalation_time = private_data->recover_wait_time / 2; - private_data->max_reply_timeouts = 0; - private_data->sequence = 0; - private_data->s->h.sequence = 0; - private_data->next_offset = 0; - *w = &private_data->worker; - JK_TRACE_EXIT(l); - return JK_LB_WORKER_TYPE; - } - else { - JK_LOG_NULL_PARAMS(l); - } - - JK_TRACE_EXIT(l); - return 0; -} diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.h deleted file mode 100644 index f0885e24..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.h +++ /dev/null @@ -1,222 +0,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. - */ - -/*************************************************************************** - * Description: load balance worker header file * - * Author: Gal Shachor * - * Author: Rainer Jung * - * Version: $Revision: 751916 $ * - ***************************************************************************/ - -#ifndef JK_LB_WORKER_H -#define JK_LB_WORKER_H - -#include "jk_logger.h" -#include "jk_service.h" -#include "jk_mt.h" -#include "jk_shm.h" - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -#define JK_LB_WORKER_NAME ("lb") -#define JK_LB_WORKER_TYPE (5) -#define JK_LB_SUB_WORKER_TYPE (7) -#define JK_LB_DEF_DOMAIN_NAME ("unknown") - -#define JK_LB_METHOD_REQUESTS (0) -#define JK_LB_METHOD_TRAFFIC (1) -#define JK_LB_METHOD_BUSYNESS (2) -#define JK_LB_METHOD_SESSIONS (3) -#define JK_LB_METHOD_DEF (JK_LB_METHOD_REQUESTS) -#define JK_LB_METHOD_MAX (JK_LB_METHOD_SESSIONS) -#define JK_LB_METHOD_TEXT_REQUESTS ("Request") -#define JK_LB_METHOD_TEXT_TRAFFIC ("Traffic") -#define JK_LB_METHOD_TEXT_BUSYNESS ("Busyness") -#define JK_LB_METHOD_TEXT_SESSIONS ("Sessions") -#define JK_LB_METHOD_TEXT_DEF (JK_LB_METHOD_TEXT_REQUESTS) -#define JK_LB_LOCK_OPTIMISTIC (0) -#define JK_LB_LOCK_PESSIMISTIC (1) -#define JK_LB_LOCK_DEF (JK_LB_LOCK_OPTIMISTIC) -#define JK_LB_LOCK_MAX (JK_LB_LOCK_PESSIMISTIC) -#define JK_LB_LOCK_TEXT_OPTIMISTIC ("Optimistic") -#define JK_LB_LOCK_TEXT_PESSIMISTIC ("Pessimistic") -#define JK_LB_LOCK_TEXT_DEF (JK_LB_LOCK_TEXT_OPTIMISTIC) -/* - * The following definitions for state and activation - * need to be kept in sync with the two macros - * JK_WORKER_USABLE() and JK_WORKER_USABLE_STICKY() in jk_lb_worker.c. - * Since we use ordered comparisons there instead of multiple - * equal/unequal compares, order of the values is critical here. - */ -#define JK_LB_STATE_IDLE (0) -#define JK_LB_STATE_OK (1) -#define JK_LB_STATE_RECOVER (2) -#define JK_LB_STATE_FORCE (3) -#define JK_LB_STATE_BUSY (4) -#define JK_LB_STATE_ERROR (5) -#define JK_LB_STATE_PROBE (6) -#define JK_LB_STATE_DEF (JK_LB_STATE_IDLE) -#define JK_LB_STATE_TEXT_IDLE ("OK/IDLE") -#define JK_LB_STATE_TEXT_OK ("OK") -#define JK_LB_STATE_TEXT_RECOVER ("ERR/REC") -#define JK_LB_STATE_TEXT_FORCE ("ERR/FRC") -#define JK_LB_STATE_TEXT_BUSY ("OK/BUSY") -#define JK_LB_STATE_TEXT_ERROR ("ERR") -#define JK_LB_STATE_TEXT_PROBE ("ERR/PRB") -#define JK_LB_STATE_TEXT_MAX (JK_LB_STATE_PROBE) -#define JK_LB_STATE_TEXT_DEF (JK_LB_STATE_TEXT_IDLE) -/* All JK_LB_ACTIVATION_* values must be single digit. */ -/* Otherwise the string encoding of the activation array */ -/* fails e.g. in the isapi redirector. */ -/* JK_LB_ACTIVATION_UNSET is not allowed as an actual worker state. */ -/* It will not work e.g. when the status worker tries to show the state. */ -/* It is only used in rule extension data to indicate, that the */ -/* activation state should not be overwritten. */ -#define JK_LB_ACTIVATION_ACTIVE (0) -#define JK_LB_ACTIVATION_DISABLED (1) -#define JK_LB_ACTIVATION_STOPPED (2) -#define JK_LB_ACTIVATION_UNSET (9) -#define JK_LB_ACTIVATION_DEF (JK_LB_ACTIVATION_ACTIVE) -#define JK_LB_ACTIVATION_MAX (JK_LB_ACTIVATION_STOPPED) -#define JK_LB_ACTIVATION_TEXT_ACTIVE ("ACT") -#define JK_LB_ACTIVATION_TEXT_DISABLED ("DIS") -#define JK_LB_ACTIVATION_TEXT_STOPPED ("STP") -#define JK_LB_ACTIVATION_TEXT_DEF (JK_LB_ACTIVATION_TEXT_ACTIVE) - -#define JK_LB_UINT64_STR_SZ (21) -#define JK_LB_NOTES_COUNT (9) -#define JK_NOTE_LB_FIRST_NAME ("JK_LB_FIRST_NAME") -#define JK_NOTE_LB_FIRST_VALUE ("JK_LB_FIRST_VALUE") -#define JK_NOTE_LB_FIRST_ACCESSED ("JK_LB_FIRST_ACCESSED") -#define JK_NOTE_LB_FIRST_READ ("JK_LB_FIRST_READ") -#define JK_NOTE_LB_FIRST_TRANSFERRED ("JK_LB_FIRST_TRANSFERRED") -#define JK_NOTE_LB_FIRST_ERRORS ("JK_LB_FIRST_ERRORS") -#define JK_NOTE_LB_FIRST_BUSY ("JK_LB_FIRST_BUSY") -#define JK_NOTE_LB_FIRST_ACTIVATION ("JK_LB_FIRST_ACTIVATION") -#define JK_NOTE_LB_FIRST_STATE ("JK_LB_FIRST_STATE") -#define JK_NOTE_LB_LAST_NAME ("JK_LB_LAST_NAME") -#define JK_NOTE_LB_LAST_VALUE ("JK_LB_LAST_VALUE") -#define JK_NOTE_LB_LAST_ACCESSED ("JK_LB_LAST_ACCESSED") -#define JK_NOTE_LB_LAST_READ ("JK_LB_LAST_READ") -#define JK_NOTE_LB_LAST_TRANSFERRED ("JK_LB_LAST_TRANSFERRED") -#define JK_NOTE_LB_LAST_ERRORS ("JK_LB_LAST_ERRORS") -#define JK_NOTE_LB_LAST_BUSY ("JK_LB_LAST_BUSY") -#define JK_NOTE_LB_LAST_ACTIVATION ("JK_LB_LAST_ACTIVATION") -#define JK_NOTE_LB_LAST_STATE ("JK_LB_LAST_STATE") - -/* Time to wait before retry. */ -#define WAIT_BEFORE_RECOVER (60) -/* We accept doing global maintenance if we are */ -/* JK_LB_MAINTAIN_TOLERANCE seconds early. */ -#define JK_LB_MAINTAIN_TOLERANCE (2) -/* We divide load values by 2^x during global maintenance. */ -/* The exponent x is JK_LB_DECAY_MULT*#MAINT_INTV_SINCE_LAST_MAINT */ -#define JK_LB_DECAY_MULT (1) - -struct lb_sub_worker -{ - jk_worker_t *worker; - /* Shared memory worker data */ - jk_shm_lb_sub_worker_t *s; - - char name[JK_SHM_STR_SIZ+1]; - /* Sequence counter starting at 0 and increasing - * every time we change the config - */ - volatile unsigned int sequence; - - /* route */ - char route[JK_SHM_STR_SIZ+1]; - /* worker domain */ - char domain[JK_SHM_STR_SIZ+1]; - /* worker redirect route */ - char redirect[JK_SHM_STR_SIZ+1]; - /* worker distance */ - int distance; - /* current activation state (config) of the worker */ - int activation; - /* Current lb factor */ - int lb_factor; - /* Current worker index */ - int i; - /* Current lb reciprocal factor */ - jk_uint64_t lb_mult; -}; -typedef struct lb_sub_worker lb_sub_worker_t; - -struct lb_worker -{ - jk_worker_t worker; - /* Shared memory worker data */ - jk_shm_lb_worker_t *s; - - char name[JK_SHM_STR_SIZ+1]; - /* Sequence counter starting at 0 and increasing - * every time we change the config - */ - volatile unsigned int sequence; - - jk_pool_t p; - jk_pool_atom_t buf[TINY_POOL_SIZE]; - - JK_CRIT_SEC cs; - - lb_sub_worker_t *lb_workers; - unsigned int num_of_workers; - int sticky_session; - int sticky_session_force; - int recover_wait_time; - int error_escalation_time; - int max_reply_timeouts; - int retries; - int retry_interval; - int lbmethod; - int lblock; - int maintain_time; - unsigned int max_packet_size; - unsigned int next_offset; - /* Session cookie */ - char session_cookie[JK_SHM_STR_SIZ+1]; - /* Session path */ - char session_path[JK_SHM_STR_SIZ+1]; -}; -typedef struct lb_worker lb_worker_t; - -int JK_METHOD lb_worker_factory(jk_worker_t **w, - const char *name, jk_logger_t *l); - -const char *jk_lb_get_lock(lb_worker_t *p, jk_logger_t *l); -int jk_lb_get_lock_code(const char *v); -const char *jk_lb_get_method(lb_worker_t *p, jk_logger_t *l); -int jk_lb_get_method_code(const char *v); -const char *jk_lb_get_state(lb_sub_worker_t *p, jk_logger_t *l); -int jk_lb_get_state_code(const char *v); -const char *jk_lb_get_activation_direct(int activation, jk_logger_t *l); -const char *jk_lb_get_activation(lb_sub_worker_t *p, jk_logger_t *l); -int jk_lb_get_activation_code(const char *v); -void reset_lb_values(lb_worker_t *p, jk_logger_t *l); -void jk_lb_pull(lb_worker_t * p, int locked, jk_logger_t *l); -void jk_lb_push(lb_worker_t * p, int locked, jk_logger_t *l); -void update_mult(lb_worker_t * p, jk_logger_t *l); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* JK_LB_WORKER_H */ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.lo deleted file mode 100644 index 1a84f8f0..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.lo +++ /dev/null @@ -1,12 +0,0 @@ -# jk_lb_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/jk_lb_worker.o' - -# Name of the non-PIC object. -non_pic_object='jk_lb_worker.o' - diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.o deleted file mode 100644 index d8b71999..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_logger.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_logger.h deleted file mode 100644 index b3ba7c99..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_logger.h +++ /dev/null @@ -1,139 +0,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. - */ - -/*************************************************************************** - * Description: Logger object definitions * - * Author: Gal Shachor * - * Version: $Revision: 1001219 $ * - ***************************************************************************/ - -#ifndef JK_LOGGER_H -#define JK_LOGGER_H - -#include "jk_global.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -#define JK_TIME_MAX_SIZE (64) - -typedef struct jk_logger jk_logger_t; -struct jk_logger -{ - void *logger_private; - int level; - const char *log_fmt; /* the configured timestamp format for logging */ - char log_fmt_subsec[JK_TIME_MAX_SIZE]; /* like log_fmt, but milli/micro seconds marker - replaced, because strftime() doesn't handle those */ - int log_fmt_type; /* do we want milli or microseconds */ - size_t log_fmt_offset; /* at which position should we insert */ - size_t log_fmt_size; /* how long is this format string */ - - int (JK_METHOD * log) (jk_logger_t *l, int level, int used, char *what); - -}; - -typedef struct jk_file_logger_t jk_file_logger_t; -struct jk_file_logger_t -{ - FILE *logfile; - /* For Apache 2 APR piped logging */ - void *jklogfp; - /* For Apache 1.3 piped logging */ - int log_fd; -}; - -/* Level like Java tracing, but available only - at compile time on DEBUG preproc define. - */ -#define JK_LOG_TRACE_LEVEL 0 -#define JK_LOG_DEBUG_LEVEL 1 -#define JK_LOG_INFO_LEVEL 2 -#define JK_LOG_WARNING_LEVEL 3 -#define JK_LOG_ERROR_LEVEL 4 -#define JK_LOG_EMERG_LEVEL 5 -#define JK_LOG_REQUEST_LEVEL 6 -#define JK_LOG_DEF_LEVEL JK_LOG_INFO_LEVEL - -#define JK_LOG_TRACE_VERB "trace" -#define JK_LOG_DEBUG_VERB "debug" -#define JK_LOG_INFO_VERB "info" -#define JK_LOG_WARN_VERB "warn" -#define JK_LOG_ERROR_VERB "error" -#define JK_LOG_EMERG_VERB "emerg" -#define JK_LOG_DEF_VERB JK_LOG_INFO_VERB - -#if defined(__GNUC__) || (defined(_MSC_VER) && (_MSC_VER > 1200)) -#define JK_LOG_TRACE __FILE__,__LINE__,__FUNCTION__,JK_LOG_TRACE_LEVEL -#define JK_LOG_DEBUG __FILE__,__LINE__,__FUNCTION__,JK_LOG_DEBUG_LEVEL -#define JK_LOG_ERROR __FILE__,__LINE__,__FUNCTION__,JK_LOG_ERROR_LEVEL -#define JK_LOG_EMERG __FILE__,__LINE__,__FUNCTION__,JK_LOG_EMERG_LEVEL -#define JK_LOG_INFO __FILE__,__LINE__,__FUNCTION__,JK_LOG_INFO_LEVEL -#define JK_LOG_WARNING __FILE__,__LINE__,__FUNCTION__,JK_LOG_WARNING_LEVEL -#else -#define JK_LOG_TRACE __FILE__,__LINE__,NULL,JK_LOG_TRACE_LEVEL -#define JK_LOG_DEBUG __FILE__,__LINE__,NULL,JK_LOG_DEBUG_LEVEL -#define JK_LOG_ERROR __FILE__,__LINE__,NULL,JK_LOG_ERROR_LEVEL -#define JK_LOG_EMERG __FILE__,__LINE__,NULL,JK_LOG_EMERG_LEVEL -#define JK_LOG_INFO __FILE__,__LINE__,NULL,JK_LOG_INFO_LEVEL -#define JK_LOG_WARNING __FILE__,__LINE__,NULL,JK_LOG_WARNING_LEVEL -#endif - -#define JK_LOG_REQUEST __FILE__,0,NULL,JK_LOG_REQUEST_LEVEL - -#if defined(JK_PRODUCTION) -/* TODO: all DEBUG messages should be compiled out - * when this define is in place. - */ -#define JK_IS_PRODUCTION 1 -#define JK_TRACE_ENTER(l) -#define JK_TRACE_EXIT(l) -#else -#define JK_IS_PRODUCTION 0 -#define JK_TRACE_ENTER(l) \ - do { \ - if ((l) && (l)->level == JK_LOG_TRACE_LEVEL) { \ - int tmp_errno = errno; \ - jk_log((l), JK_LOG_TRACE, "enter"); \ - errno = tmp_errno; \ - } } while (0) - -#define JK_TRACE_EXIT(l) \ - do { \ - if ((l) && (l)->level == JK_LOG_TRACE_LEVEL) { \ - int tmp_errno = errno; \ - jk_log((l), JK_LOG_TRACE, "exit"); \ - errno = tmp_errno; \ - } } while (0) - -#endif /* JK_PRODUCTION */ - -#define JK_LOG_NULL_PARAMS(l) jk_log((l), JK_LOG_ERROR, "NULL parameters") - -/* Debug level macro - * It is more efficient to check the level prior - * calling function that will not execute anyhow because of level - */ -#define JK_IS_DEBUG_LEVEL(l) ((l) && (l)->level < JK_LOG_INFO_LEVEL) - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* JK_LOGGER_H */ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.c deleted file mode 100644 index 4b025425..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.c +++ /dev/null @@ -1,889 +0,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. - */ - -/*************************************************************************** - * Description: General purpose map object * - * Author: Gal Shachor * - * Author: Mladen Turk * - * Version: $Revision: 1042364 $ * - ***************************************************************************/ -#if defined(AS400) && !defined(AS400_UTF8) -#include "apr_xlate.h" -#endif - -#include "jk_global.h" -#include "jk_pool.h" -#include "jk_util.h" -#include "jk_map.h" - -#define CAPACITY_INC_SIZE (50) -#define LENGTH_OF_LINE (8192) -#define JK_MAP_RECURSION (20) -#define JK_MAP_REFERENCE (".reference") -#define JK_MAP_REFERENCE_SZ (strlen(JK_MAP_REFERENCE)) - -/* Compute the "checksum" for a key, consisting of the first - * 4 bytes, 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 strcmp - */ -#define COMPUTE_KEY_CHECKSUM(key, checksum) \ -{ \ - const char *k = (key); \ - unsigned int c = (unsigned int)*k; \ - (checksum) = c; \ - (checksum) <<= 8; \ - if (c) { \ - c = (unsigned int)*++k; \ - checksum |= c; \ - } \ - (checksum) <<= 8; \ - if (c) { \ - c = (unsigned int)*++k; \ - checksum |= c; \ - } \ - (checksum) <<= 8; \ - if (c) { \ - c = (unsigned int)*++k; \ - checksum |= c; \ - } \ -} - -struct jk_map -{ - jk_pool_t p; - jk_pool_atom_t buf[SMALL_POOL_SIZE]; - - const char **names; - const void **values; - unsigned int *keys; - - unsigned int capacity; - unsigned int size; -}; - -static void trim_prp_comment(char *prp); -static size_t trim(char *s); -static int map_realloc(jk_map_t *m); -static char *jk_map_replace_properties(jk_map_t *m, jk_map_t *env, char *value); - -int jk_map_alloc(jk_map_t **m) -{ - if (m) { - return jk_map_open(*m = (jk_map_t *)malloc(sizeof(jk_map_t))); - } - - return JK_FALSE; -} - -int jk_map_free(jk_map_t **m) -{ - int rc = JK_FALSE; - - if (m && *m) { - jk_map_close(*m); - free(*m); - *m = NULL; - } - - return rc; -} - -int jk_map_open(jk_map_t *m) -{ - int rc = JK_FALSE; - - if (m) { - jk_open_pool(&m->p, m->buf, sizeof(jk_pool_atom_t) * SMALL_POOL_SIZE); - m->capacity = 0; - m->size = 0; - m->keys = NULL; - m->names = NULL; - m->values = NULL; - rc = JK_TRUE; - } - - return rc; -} - -int jk_map_close(jk_map_t *m) -{ - int rc = JK_FALSE; - - if (m) { - jk_close_pool(&m->p); - rc = JK_TRUE; - } - - return rc; -} - -void *jk_map_get(jk_map_t *m, const char *name, const void *def) -{ - const void *rc = (void *)def; - - if (m && name) { - unsigned int i; - unsigned int key; - COMPUTE_KEY_CHECKSUM(name, key) - for (i = 0; i < m->size; i++) { - if (m->keys[i] == key && strcmp(m->names[i], name) == 0) { - rc = m->values[i]; - break; - } - } - } - - return (void *)rc; /* DIRTY */ -} - -int jk_map_get_id(jk_map_t *m, const char *name) -{ - int rc = -1; - if (m && name) { - unsigned int i; - unsigned int key; - COMPUTE_KEY_CHECKSUM(name, key) - for (i = 0; i < m->size; i++) { - if (m->keys[i] == key && strcmp(m->names[i], name) == 0) { - rc = i; - break; - } - } - } - - return rc; -} - -const char *jk_map_get_string(jk_map_t *m, const char *name, const char *def) -{ - const char *rc = def; - - if (m && name) { - unsigned int i; - unsigned int key; - COMPUTE_KEY_CHECKSUM(name, key) - for (i = 0; i < m->size; i++) { - if (m->keys[i] == key && strcmp(m->names[i], name) == 0) { - rc = m->values[i]; - break; - } - } - } - - return rc; -} - - -int jk_map_get_int(jk_map_t *m, const char *name, int def) -{ - char buf[100]; - const char *rc; - size_t len; - int int_res; - int multit = 1; - - sprintf(buf, "%d", def); - rc = jk_map_get_string(m, name, buf); - - len = strlen(rc); - if (len) { - char *lastchar = &buf[0] + len - 1; - strcpy(buf, rc); - if ('m' == *lastchar || 'M' == *lastchar) { - *lastchar = '\0'; - multit = 1024 * 1024; - } - else if ('k' == *lastchar || 'K' == *lastchar) { - *lastchar = '\0'; - multit = 1024; - } - int_res = atoi(buf); - } - else - int_res = def; - - return int_res * multit; -} - -double jk_map_get_double(jk_map_t *m, const char *name, double def) -{ - char buf[100]; - const char *rc; - - sprintf(buf, "%f", def); - rc = jk_map_get_string(m, name, buf); - - return atof(rc); -} - -int jk_map_get_bool(jk_map_t *m, const char *name, int def) -{ - char buf[100]; - const char *rc; - - sprintf(buf, "%d", def); - rc = jk_map_get_string(m, name, buf); - - return jk_get_bool_code(rc, def); -} - -char **jk_map_get_string_list(jk_map_t *m, - const char *name, - unsigned int *list_len, const char *def) -{ - const char *l = jk_map_get_string(m, name, def); - char **ar = NULL; - -#ifdef _MT_CODE_PTHREAD - char *lasts; -#endif - - *list_len = 0; - - if (l) { - unsigned capacity = 0; - unsigned idex = 0; - char *p; - char *v = jk_pool_strdup(&m->p, l); - - if (!v) { - return NULL; - } - - /* - * GS, in addition to VG's patch, we now need to - * strtok also by a "*" - */ -#ifdef _MT_CODE_PTHREAD - for (p = strtok_r(v, " \t,", &lasts); - p; p = strtok_r(NULL, " \t,", &lasts)) -#else - for (p = strtok(v, " \t,"); p; p = strtok(NULL, " \t,")) -#endif - - { - - if (idex == capacity) { - ar = jk_pool_realloc(&m->p, - sizeof(char *) * (capacity + 5), - ar, sizeof(char *) * capacity); - if (!ar) { - return JK_FALSE; - } - capacity += 5; - } - ar[idex] = jk_pool_strdup(&m->p, p); - idex++; - } - - *list_len = idex; - } - - return ar; -} - -int jk_map_get_int_list(jk_map_t *m, - const char *name, - int *list, - unsigned int list_len, - const char *def) -{ - const char *l = jk_map_get_string(m, name, def); - -#ifdef _MT_CODE_PTHREAD - char *lasts; -#endif - - if (!list_len) - return 0; - - if (l) { - unsigned int capacity = list_len; - unsigned int index = 0; - char *p; - char *v = jk_pool_strdup(&m->p, l); - - if (!v) { - return 0; - } - - /* - * GS, in addition to VG's patch, we now need to - * strtok also by a "*" - */ -#ifdef _MT_CODE_PTHREAD - for (p = strtok_r(v, " \t,", &lasts); - p; p = strtok_r(NULL, " \t,", &lasts)) -#else - for (p = strtok(v, " \t,"); p; p = strtok(NULL, " \t,")) -#endif - - { - if (index < capacity) { - list[index] = atoi(p); - index++; - } - else - break; - } - return index; - } - return 0; -} - -int jk_map_add(jk_map_t *m, const char *name, const void *value) -{ - int rc = JK_FALSE; - - if (m && name) { - unsigned int key; - COMPUTE_KEY_CHECKSUM(name, key) - map_realloc(m); - - if (m->size < m->capacity) { - m->values[m->size] = value; - m->names[m->size] = jk_pool_strdup(&m->p, name); - m->keys[m->size] = key; - m->size++; - rc = JK_TRUE; - } - } - - return rc; -} - -int jk_map_put(jk_map_t *m, const char *name, const void *value, void **old) -{ - int rc = JK_FALSE; - - if (m && name) { - unsigned int i; - unsigned int key; - COMPUTE_KEY_CHECKSUM(name, key) - for (i = 0; i < m->size; i++) { - if (m->keys[i] == key && strcmp(m->names[i], name) == 0) { - break; - } - } - - if (i < m->size) { - if (old) - *old = (void *)m->values[i]; /* DIRTY */ - m->values[i] = value; - rc = JK_TRUE; - } - else { - rc = jk_map_add(m, name, value); - } - } - - return rc; -} - - -static int jk_map_validate_property(char *prp, jk_logger_t *l) -{ - /* check the worker properties */ - if (!jk_is_valid_property(prp)) { - jk_log(l, JK_LOG_ERROR, - "The attribute '%s' is not supported - please check" - " the documentation for the supported attributes.", - prp); - return JK_FALSE; - } - if (jk_is_deprecated_property(prp)) { - jk_log(l, JK_LOG_WARNING, - "The attribute '%s' is deprecated - please check" - " the documentation for the correct replacement.", - prp); - } - return JK_TRUE; -} - -static int jk_map_handle_duplicates(jk_map_t *m, const char *prp, char **v, - int treatment, jk_logger_t *l) -{ - const char *oldv = jk_map_get_string(m, prp, NULL); - if (oldv) { - if ((treatment == JK_MAP_HANDLE_DUPLICATES) - && jk_is_unique_property(prp) == JK_FALSE) { - char *tmpv = jk_pool_alloc(&m->p, - strlen(*v) + strlen(oldv) + 3); - if (tmpv) { - char sep = '*'; - if (jk_is_path_property(prp)) - sep = PATH_SEPERATOR; - else if (jk_is_cmd_line_property(prp)) - sep = ' '; - else if (jk_is_list_property(prp)) - sep = ','; - sprintf(tmpv, "%s%c%s", oldv, sep, *v); - } - *v = tmpv; - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Concatenated value is: %s -> %s", - prp, *v); - return JK_FALSE; - } - else { - jk_log(l, JK_LOG_WARNING, - "Duplicate key '%s' detected - previous value '%s'" - " will be overwritten with '%s'.", - prp, oldv ? oldv : "(null)", v ? *v : "(null)"); - return JK_TRUE; - } - } - else { - return JK_TRUE; - } -} - -int jk_map_read_property(jk_map_t *m, jk_map_t *env, const char *str, - int treatment, jk_logger_t *l) -{ - int rc = JK_TRUE; - char buf[LENGTH_OF_LINE + 1]; - char *prp = &buf[0]; - - if (strlen(str) > LENGTH_OF_LINE) { - jk_log(l, JK_LOG_WARNING, - "Line to long (%d > %d), ignoring entry", - strlen(str), LENGTH_OF_LINE); - return JK_FALSE; - } - - strcpy(prp, str); - if (trim(prp)) { - char *v = strchr(prp, '='); - if (v) { - *v = '\0'; - v++; - if (trim(v) && trim(prp)) { - if (treatment == JK_MAP_HANDLE_RAW) { - v = jk_pool_strdup(&m->p, v); - } - else { - if (jk_map_validate_property(prp, l) == JK_FALSE) - return JK_FALSE; - v = jk_map_replace_properties(m, env, v); - if (jk_map_handle_duplicates(m, prp, &v, treatment, l) == JK_TRUE) - v = jk_pool_strdup(&m->p, v); - } - if (v) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Adding property '%s' with value '%s' to map.", - prp, v); - jk_map_put(m, prp, v, NULL); - } - else { - JK_LOG_NULL_PARAMS(l); - rc = JK_FALSE; - } - } - } - } - return rc; -} - - -int jk_map_read_properties(jk_map_t *m, jk_map_t *env, const char *f, time_t *modified, - int treatment, jk_logger_t *l) -{ - int rc = JK_FALSE; - - if (m && f) { - struct stat statbuf; - FILE *fp; - if (jk_stat(f, &statbuf) == -1) - return JK_FALSE; -#if defined(AS400) && !defined(AS400_UTF8) - fp = fopen(f, "r, o_ccsid=0"); -#else - fp = fopen(f, "r"); -#endif - - if (fp) { - char buf[LENGTH_OF_LINE + 1]; - char *prp; - - rc = JK_TRUE; - - while (NULL != (prp = fgets(buf, LENGTH_OF_LINE, fp))) { - trim_prp_comment(prp); - if (*prp) { - if ((rc = jk_map_read_property(m, env, prp, treatment, l)) == JK_FALSE) - break; - } - } - fclose(fp); - if (modified) - *modified = statbuf.st_mtime; - } - } - - return rc; -} - - -int jk_map_size(jk_map_t *m) -{ - if (m) { - return m->size; - } - - return -1; -} - -const char *jk_map_name_at(jk_map_t *m, int idex) -{ - if (m && idex >= 0) { - return m->names[idex]; /* DIRTY */ - } - - return NULL; -} - -void *jk_map_value_at(jk_map_t *m, int idex) -{ - if (m && idex >= 0) { - return (void *)m->values[idex]; /* DIRTY */ - } - - return NULL; -} - -void jk_map_dump(jk_map_t *m, jk_logger_t *l) -{ - if (m) { - int s = jk_map_size(m); - int i; - for (i=0;i '%s'", - jk_map_name_at(m, i) ? jk_map_name_at(m, i) : "(null)", - jk_map_value_at(m, i) ? jk_map_value_at(m, i) : "(null)"); - } - } - } -} - -int jk_map_copy(jk_map_t *src, jk_map_t *dst) -{ - int sz = jk_map_size(src); - int i; - for (i = 0; i < sz; i++) { - const char *name = jk_map_name_at(src, i); - if (jk_map_get(dst, name, NULL) == NULL) { - if (!jk_map_put(dst, name, - jk_pool_strdup(&dst->p, jk_map_get_string(src, name, NULL)), - NULL)) { - return JK_FALSE; - } - } - } - return JK_TRUE; -} - - -static void trim_prp_comment(char *prp) -{ -#if defined(AS400) && !defined(AS400_UTF8) - char *comment; - /* lots of lines that translate a '#' realtime deleted */ - comment = strchr(prp, *APR_NUMBERSIGN); -#else - char *comment = strchr(prp, '#'); -#endif - if (comment) { - *comment = '\0'; - } -} - -static size_t trim(char *s) -{ - size_t first; - size_t len; - - /* check for empty strings */ - if (!(len = strlen(s))) - return 0; - for (len = len - 1; (len > 0) && - isspace((int)((unsigned char)s[len])); len--); - if ((len > 0) || !isspace((int)((unsigned char)s[len]))) { - len++; - } - - s[len] = '\0'; - len++; - - for (first = 0; (s[first] != '\0') && - isspace((int)((unsigned char)s[first])); first++); - - if (first > 0) { - memmove(s, s + first, len - first); - } - - return len; -} - -static int map_realloc(jk_map_t *m) -{ - if (m->size == m->capacity) { - char **names; - void **values; - unsigned int *keys; - int capacity = m->capacity + CAPACITY_INC_SIZE; - - names = (char **)jk_pool_alloc(&m->p, sizeof(char *) * capacity); - values = (void **)jk_pool_alloc(&m->p, sizeof(void *) * capacity); - keys = (unsigned int *)jk_pool_alloc(&m->p, sizeof(unsigned int) * capacity); - - if (values && names) { - if (m->capacity && m->names) - memcpy(names, m->names, sizeof(char *) * m->capacity); - - if (m->capacity && m->values) - memcpy(values, m->values, sizeof(void *) * m->capacity); - - if (m->capacity && m->keys) - memcpy(keys, m->keys, sizeof(unsigned int) * m->capacity); - - m->names = (const char **)names; - m->values = (const void **)values; - m->keys = keys; - m->capacity = capacity; - - return JK_TRUE; - } - } - - return JK_FALSE; -} - -/** - * Replace $(property) in value. - * - */ -static char *jk_map_replace_properties(jk_map_t *m, jk_map_t *env, char *value) -{ - char *rc = value; - char *env_start = rc; - int rec = 0; - - while ((env_start = strstr(env_start, "$(")) != NULL) { - char *env_end = strstr(env_start, ")"); - if (rec++ > 20) - return rc; - if (env_end) { - char env_name[LENGTH_OF_LINE + 1] = ""; - const char *env_value; -#if defined(WIN32) - char env_buf[LENGTH_OF_LINE + 1]; -#endif - *env_end = '\0'; - strcpy(env_name, env_start + 2); - *env_end = ')'; - - env_value = jk_map_get_string(m, env_name, NULL); - if (!env_value) { - env_value = getenv(env_name); - } - if (!env_value && env) { - /* Search inside local environment table */ - env_value = jk_map_get_string(env, env_name, NULL); - } - -#if defined(WIN32) - if (!env_value) { - /* Try the env block from calling process */ - if (GetEnvironmentVariable(env_name, env_buf, - sizeof(env_buf))) - env_value = &env_buf[0]; - } -#endif - if (env_value) { - size_t offset = 0; - char *new_value = jk_pool_alloc(&m->p, - (sizeof(char) * - (strlen(rc) + - strlen(env_value)))); - if (!new_value) { - break; - } - *env_start = '\0'; - strcpy(new_value, rc); - strcat(new_value, env_value); - strcat(new_value, env_end + 1); - offset = env_start - rc + strlen(env_value); - rc = new_value; - /* Avoid recursive subst */ - env_start = rc + offset; - } - else { - env_start = env_end; - } - } - else { - break; - } - } - - return rc; -} - -/** - * Resolve references - * - */ -int jk_map_resolve_references(jk_map_t *m, const char *prefix, - int wildcard, int depth, jk_logger_t *l) -{ - int rc = JK_FALSE; - - JK_TRACE_ENTER(l); - - if (m && prefix) { - if (depth <= JK_MAP_RECURSION) { - size_t prelen = strlen(prefix); - unsigned int i; - rc = JK_TRUE; - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Checking for references with prefix %s with%s wildcard (recursion %d)", - prefix, wildcard? "" : "out", depth); - for (i = 0; i < m->size; i++) { - char *v = (char *)m->values[i]; - if (v && *v && - !strncmp(m->names[i], prefix, prelen)) { - size_t remain = strlen(m->names[i]) - prelen; - if ((remain == JK_MAP_REFERENCE_SZ ) || (wildcard && remain > JK_MAP_REFERENCE_SZ)) { - remain = strlen(m->names[i]) - JK_MAP_REFERENCE_SZ; - if (!strncmp(m->names[i] + remain, JK_MAP_REFERENCE, JK_MAP_REFERENCE_SZ)) { - char *from = jk_pool_alloc(&m->p, - (sizeof(char) * - (strlen(v) + 2))); - char *to = jk_pool_alloc(&m->p, - (sizeof(char) * - (remain + 2))); - if (!from || !to) { - jk_log(l, JK_LOG_ERROR, - "Error in string allocation"); - rc = JK_FALSE; - break; - } - strcpy(from, v); - *(from+strlen(v)) = '.'; - *(from+strlen(v)+1) = '\0'; - strncpy(to, m->names[i], remain); - *(to+remain) = '.'; - *(to+remain+1) = '\0'; - - rc = jk_map_resolve_references(m, v, 0, depth+1, l); - if (rc == JK_FALSE) { - break; - } - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Copying values from %s to %s", - from, to); - rc = jk_map_inherit_properties(m, from, to, l); - if (rc == JK_FALSE) { - break; - } - } - } - } - } - } - else { - jk_log(l, JK_LOG_ERROR, - "Recursion limit %d for worker references with prefix '%s' reached", - JK_MAP_RECURSION, prefix); - } - } - else { - JK_LOG_NULL_PARAMS(l); - } - JK_TRACE_EXIT(l); - return rc; -} - -/** - * Inherit properties - * - */ -int jk_map_inherit_properties(jk_map_t *m, const char *from, const char *to, jk_logger_t *l) -{ - int rc = JK_FALSE; - const char *prp; - char *to_prp; - - if (m && from && to) { - unsigned int i; - for (i = 0; i < m->size; i++) { - if (!strncmp(m->names[i], from, strlen(from))) { - rc = JK_TRUE; - prp = m->names[i] + strlen(from); - to_prp = jk_pool_alloc(&m->p, - (sizeof(char) * - (strlen(to) + - strlen(prp) + 1))); - if (!to_prp) { - jk_log(l, JK_LOG_ERROR, - "Error in string allocation for attribute '%s.%s'", - to, prp); - rc = JK_FALSE; - break; - } - strcpy(to_prp, to); - strcat(to_prp, prp); - if (jk_map_get_id(m, to_prp) < 0 ) { - rc = jk_map_add(m, to_prp, m->values[i]); - if (rc == JK_FALSE) { - jk_log(l, JK_LOG_ERROR, - "Error when adding attribute '%s'", - to_prp); - break; - } - } - } - } - if ( rc == JK_FALSE) { - jk_log(l, JK_LOG_ERROR, - "Reference '%s' not found", - from); - } - } - else { - JK_LOG_NULL_PARAMS(l); - } - return rc; -} diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.h deleted file mode 100644 index 6e88861d..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.h +++ /dev/null @@ -1,95 +0,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. - */ - -/*************************************************************************** - * Description: Map object header file * - * Author: Gal Shachor * - * Version: $Revision: 756058 $ * - ***************************************************************************/ - -#ifndef JK_MAP_H -#define JK_MAP_H - - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -#define JK_MAP_HANDLE_NORMAL 0 -#define JK_MAP_HANDLE_DUPLICATES 1 -#define JK_MAP_HANDLE_RAW 2 - -struct jk_map; -typedef struct jk_map jk_map_t; - -int jk_map_alloc(jk_map_t **m); - -int jk_map_free(jk_map_t **m); - -int jk_map_open(jk_map_t *m); - -int jk_map_close(jk_map_t *m); - -void *jk_map_get(jk_map_t *m, const char *name, const void *def); - -int jk_map_get_id(jk_map_t *m, const char *name); - -int jk_map_get_int(jk_map_t *m, const char *name, int def); - -double jk_map_get_double(jk_map_t *m, const char *name, double def); - -int jk_map_get_bool(jk_map_t *m, const char *name, int def); - -const char *jk_map_get_string(jk_map_t *m, const char *name, const char *def); - -char **jk_map_get_string_list(jk_map_t *m, - const char *name, - unsigned *list_len, const char *def); - -int jk_map_get_int_list(jk_map_t *m, - const char *name, - int *list, unsigned int list_len, - const char *def); - -int jk_map_add(jk_map_t *m, const char *name, const void *value); - -int jk_map_put(jk_map_t *m, const char *name, const void *value, void **old); - -int jk_map_read_property(jk_map_t *m, jk_map_t *env, const char *str, int treatment, jk_logger_t *l); - -int jk_map_read_properties(jk_map_t *m, jk_map_t *env, const char *f, time_t *modified, int treatment, jk_logger_t *l); - -int jk_map_size(jk_map_t *m); - -const char *jk_map_name_at(jk_map_t *m, int idex); - -void *jk_map_value_at(jk_map_t *m, int idex); - -void jk_map_dump(jk_map_t *m, jk_logger_t *l); - -int jk_map_copy(jk_map_t *src, jk_map_t *dst); - -int jk_map_resolve_references(jk_map_t *m, const char *prefix, int wildcard, int depth, jk_logger_t *l); - -int jk_map_inherit_properties(jk_map_t *m, const char *from, const char *to, jk_logger_t *l); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* JK_MAP_H */ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.lo deleted file mode 100644 index 137e8eac..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.lo +++ /dev/null @@ -1,12 +0,0 @@ -# jk_map.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/jk_map.o' - -# Name of the non-PIC object. -non_pic_object='jk_map.o' - diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.o deleted file mode 100644 index 5274ff78..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.c deleted file mode 100644 index 1edcd073..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.c +++ /dev/null @@ -1,475 +0,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. - */ - -/* - * 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 ap_MD5Encode() 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 - * ---------------------------------------------------------------------------- - */ - -/*************************************************************************** - * Description: MD5 encoding wrapper * - * Author: Henri Gomez * - * Version: $Revision: 466585 $ * - ***************************************************************************/ - -/* - * JK MD5 Encoding function (jk_MD5Encode) - * - * Jk delegate MD5 encoding to ap_MD5Encode when used in Apache Web-Server. - * When another web-server is used like NES/IIS, we should use corresponding calls. - * NES/IIS specialists will add the necessary code but until that, I reused the code - * from Apache HTTP server. - * - * Nota: If you use an EBCDIC system without Apache, you'll have to use MD5 encoding - * corresponding call or have a ebcdic2ascii() functions somewhere. - * For example current AS/400 have MD5 encoding support APIs but olders not.... - */ - -#include "jk_global.h" -#include "jk_md5.h" - -char *JK_METHOD jk_hextocstr(unsigned char *org, char *dst, int n) -{ - char *os = dst; - unsigned char v; - static unsigned char zitohex[] = "0123456789ABCDEF"; - - while (--n >= 0) { - v = *org++; - *dst++ = zitohex[v >> 4]; - *dst++ = zitohex[v & 0x0f]; - } - *dst = 0; - - return (os); -} - -#ifndef USE_APACHE_MD5 - -/* Constants for MD5Transform routine. - */ - -#define S11 7 -#define S12 12 -#define S13 17 -#define S14 22 -#define S21 5 -#define S22 9 -#define S23 14 -#define S24 20 -#define S31 4 -#define S32 11 -#define S33 16 -#define S34 23 -#define S41 6 -#define S42 10 -#define S43 15 -#define S44 21 - -static void MD5Transform(jk_uint32_t state[4], const unsigned char block[64]); -static void Encode(unsigned char *output, const jk_uint32_t * input, size_t len); -static void Decode(jk_uint32_t * output, const unsigned char *input, size_t len); -static void jk_MD5Init(JK_MD5_CTX * context); -static void jk_MD5Update(JK_MD5_CTX * context, const unsigned char *input, - size_t inputLen); -/*static void jk_MD5Final(unsigned char digest[JK_MD5_DIGESTSIZE], JK_MD5_CTX *context);*/ - -static unsigned char PADDING[64] = { - 0x80, 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, 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 -}; - -/* F, G, H and I are basic MD5 functions. - */ -#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) -#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) -#define H(x, y, z) ((x) ^ (y) ^ (z)) -#define I(x, y, z) ((y) ^ ((x) | (~z))) - -/* ROTATE_LEFT rotates x left n bits. - */ -#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) - -/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. - Rotation is separate from addition to prevent recomputation. - */ -#define FF(a, b, c, d, x, s, ac) { \ - (a) += F ((b), (c), (d)) + (x) + (jk_uint32_t)(ac); \ - (a) = ROTATE_LEFT ((a), (s)); \ - (a) += (b); \ - } -#define GG(a, b, c, d, x, s, ac) { \ - (a) += G ((b), (c), (d)) + (x) + (jk_uint32_t)(ac); \ - (a) = ROTATE_LEFT ((a), (s)); \ - (a) += (b); \ - } -#define HH(a, b, c, d, x, s, ac) { \ - (a) += H ((b), (c), (d)) + (x) + (jk_uint32_t)(ac); \ - (a) = ROTATE_LEFT ((a), (s)); \ - (a) += (b); \ - } -#define II(a, b, c, d, x, s, ac) { \ - (a) += I ((b), (c), (d)) + (x) + (jk_uint32_t)(ac); \ - (a) = ROTATE_LEFT ((a), (s)); \ - (a) += (b); \ - } - -/* MD5 initialization. Begins an MD5 operation, writing a new context. - */ -static void jk_MD5Init(JK_MD5_CTX * context) -{ - context->count[0] = context->count[1] = 0; - /* Load magic initialization constants. */ - context->state[0] = 0x67452301; - context->state[1] = 0xefcdab89; - context->state[2] = 0x98badcfe; - context->state[3] = 0x10325476; -} - -/* MD5 block update operation. Continues an MD5 message-digest - operation, processing another message block, and updating the - context. - */ -static void jk_MD5Update(JK_MD5_CTX * context, const unsigned char *input, - size_t inputLen) -{ - size_t i, idx, partLen; - - /* Compute number of bytes mod 64 */ - idx = (size_t) ((context->count[0] >> 3) & 0x3F); - - /* Update number of bits */ - if ((context->count[0] += ((jk_uint32_t) inputLen << 3)) - < ((jk_uint32_t) inputLen << 3)) { - context->count[1]++; - } - context->count[1] += (jk_uint32_t) inputLen >> 29; - - partLen = 64 - idx; - - /* Transform as many times as possible. */ -#ifndef CHARSET_EBCDIC - if (inputLen >= partLen) { - memcpy(&context->buffer[idx], input, partLen); - MD5Transform(context->state, context->buffer); - - for (i = partLen; i + 63 < inputLen; i += 64) { - MD5Transform(context->state, &input[i]); - } - - idx = 0; - } - else { - i = 0; - } - - /* Buffer remaining input */ - memcpy(&context->buffer[idx], &input[i], inputLen - i); -#else /*CHARSET_EBCDIC */ - if (inputLen >= partLen) { - ebcdic2ascii(&context->buffer[idx], input, partLen); - MD5Transform(context->state, context->buffer); - - for (i = partLen; i + 63 < inputLen; i += 64) { - unsigned char inp_tmp[64]; - ebcdic2ascii(inp_tmp, &input[i], 64); - MD5Transform(context->state, inp_tmp); - } - - idx = 0; - } - else { - i = 0; - } - - /* Buffer remaining input */ - ebcdic2ascii(&context->buffer[idx], &input[i], inputLen - i); -#endif /*CHARSET_EBCDIC */ -} - -/* MD5 finalization. Ends an MD5 message-digest operation, writing the - the message digest and zeroizing the context. - */ -static void JK_METHOD jk_MD5Final(unsigned char digest[16], JK_MD5_CTX * context) -{ - unsigned char bits[8]; - size_t idx, padLen; - - - /* Save number of bits */ - Encode(bits, context->count, 8); - -#ifdef CHARSET_EBCDIC - /* XXX: @@@: In order to make this no more complex than necessary, - * this kludge converts the bits[] array using the ascii-to-ebcdic - * table, because the following jk_MD5Update() re-translates - * its input (ebcdic-to-ascii). - * Otherwise, we would have to pass a "conversion" flag to jk_MD5Update() - */ - ascii2ebcdic(bits, bits, 8); - - /* Since everything is converted to ascii within jk_MD5Update(), - * the initial 0x80 (PADDING[0]) must be stored as 0x20 - */ - ascii2ebcdic(PADDING, PADDING, 1); -#endif /*CHARSET_EBCDIC */ - - /* Pad out to 56 mod 64. */ - idx = (size_t) ((context->count[0] >> 3) & 0x3f); - padLen = (idx < 56) ? (56 - idx) : (120 - idx); - jk_MD5Update(context, (const unsigned char *)PADDING, padLen); - - /* Append length (before padding) */ - jk_MD5Update(context, (const unsigned char *)bits, 8); - - /* Store state in digest */ - Encode(digest, context->state, 16); - - /* Zeroize sensitive information. */ - memset(context, 0, sizeof(*context)); -} - -/* MD5 basic transformation. Transforms state based on block. */ -static void MD5Transform(jk_uint32_t state[4], const unsigned char block[64]) -{ - jk_uint32_t a = state[0], b = state[1], c = state[2], d = state[3], x[16]; - - Decode(x, block, 64); - - /* Round 1 */ - FF(a, b, c, d, x[0], S11, 0xd76aa478); /* 1 */ - FF(d, a, b, c, x[1], S12, 0xe8c7b756); /* 2 */ - FF(c, d, a, b, x[2], S13, 0x242070db); /* 3 */ - FF(b, c, d, a, x[3], S14, 0xc1bdceee); /* 4 */ - FF(a, b, c, d, x[4], S11, 0xf57c0faf); /* 5 */ - FF(d, a, b, c, x[5], S12, 0x4787c62a); /* 6 */ - FF(c, d, a, b, x[6], S13, 0xa8304613); /* 7 */ - FF(b, c, d, a, x[7], S14, 0xfd469501); /* 8 */ - FF(a, b, c, d, x[8], S11, 0x698098d8); /* 9 */ - FF(d, a, b, c, x[9], S12, 0x8b44f7af); /* 10 */ - FF(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ - FF(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ - FF(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ - FF(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ - FF(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ - FF(b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ - - /* Round 2 */ - GG(a, b, c, d, x[1], S21, 0xf61e2562); /* 17 */ - GG(d, a, b, c, x[6], S22, 0xc040b340); /* 18 */ - GG(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ - GG(b, c, d, a, x[0], S24, 0xe9b6c7aa); /* 20 */ - GG(a, b, c, d, x[5], S21, 0xd62f105d); /* 21 */ - GG(d, a, b, c, x[10], S22, 0x2441453); /* 22 */ - GG(c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ - GG(b, c, d, a, x[4], S24, 0xe7d3fbc8); /* 24 */ - GG(a, b, c, d, x[9], S21, 0x21e1cde6); /* 25 */ - GG(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ - GG(c, d, a, b, x[3], S23, 0xf4d50d87); /* 27 */ - GG(b, c, d, a, x[8], S24, 0x455a14ed); /* 28 */ - GG(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ - GG(d, a, b, c, x[2], S22, 0xfcefa3f8); /* 30 */ - GG(c, d, a, b, x[7], S23, 0x676f02d9); /* 31 */ - GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ - - /* Round 3 */ - HH(a, b, c, d, x[5], S31, 0xfffa3942); /* 33 */ - HH(d, a, b, c, x[8], S32, 0x8771f681); /* 34 */ - HH(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ - HH(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ - HH(a, b, c, d, x[1], S31, 0xa4beea44); /* 37 */ - HH(d, a, b, c, x[4], S32, 0x4bdecfa9); /* 38 */ - HH(c, d, a, b, x[7], S33, 0xf6bb4b60); /* 39 */ - HH(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ - HH(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ - HH(d, a, b, c, x[0], S32, 0xeaa127fa); /* 42 */ - HH(c, d, a, b, x[3], S33, 0xd4ef3085); /* 43 */ - HH(b, c, d, a, x[6], S34, 0x4881d05); /* 44 */ - HH(a, b, c, d, x[9], S31, 0xd9d4d039); /* 45 */ - HH(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ - HH(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ - HH(b, c, d, a, x[2], S34, 0xc4ac5665); /* 48 */ - - /* Round 4 */ - II(a, b, c, d, x[0], S41, 0xf4292244); /* 49 */ - II(d, a, b, c, x[7], S42, 0x432aff97); /* 50 */ - II(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ - II(b, c, d, a, x[5], S44, 0xfc93a039); /* 52 */ - II(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ - II(d, a, b, c, x[3], S42, 0x8f0ccc92); /* 54 */ - II(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ - II(b, c, d, a, x[1], S44, 0x85845dd1); /* 56 */ - II(a, b, c, d, x[8], S41, 0x6fa87e4f); /* 57 */ - II(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ - II(c, d, a, b, x[6], S43, 0xa3014314); /* 59 */ - II(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ - II(a, b, c, d, x[4], S41, 0xf7537e82); /* 61 */ - II(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ - II(c, d, a, b, x[2], S43, 0x2ad7d2bb); /* 63 */ - II(b, c, d, a, x[9], S44, 0xeb86d391); /* 64 */ - - state[0] += a; - state[1] += b; - state[2] += c; - state[3] += d; - - /* Zeroize sensitive information. */ - memset(x, 0, sizeof(x)); -} - -/* Encodes input (jk_uint32_t) into output (unsigned char). Assumes len is - a multiple of 4. - */ -static void Encode(unsigned char *output, const jk_uint32_t * input, size_t len) -{ - size_t i, j; - jk_uint32_t k; - - for (i = 0, j = 0; j < len; i++, j += 4) { - k = input[i]; - output[j] = (unsigned char)(k & 0xff); - output[j + 1] = (unsigned char)((k >> 8) & 0xff); - output[j + 2] = (unsigned char)((k >> 16) & 0xff); - output[j + 3] = (unsigned char)((k >> 24) & 0xff); - } -} - -/* Decodes input (unsigned char) into output (jk_uint32_t). Assumes len is - * a multiple of 4. - */ -static void Decode(jk_uint32_t * output, const unsigned char *input, size_t len) -{ - size_t i, j; - - for (i = 0, j = 0; j < len; i++, j += 4) - output[i] = ((jk_uint32_t) input[j]) | (((jk_uint32_t) input[j + 1]) << 8) | - (((jk_uint32_t) input[j + 2]) << 16) | (((jk_uint32_t) input[j + 3]) << - 24); -} - -char *JK_METHOD jk_md5(const unsigned char *org, const unsigned char *org2, - char *dst) -{ - JK_MD5_CTX ctx; - char buf[JK_MD5_DIGESTSIZE + 1]; - - jk_MD5Init(&ctx); - jk_MD5Update(&ctx, org, strlen((const char *)org)); - - if (org2 != NULL) - jk_MD5Update(&ctx, org2, strlen((const char *)org2)); - - jk_MD5Final((unsigned char *)buf, &ctx); - return (jk_hextocstr((unsigned char *)buf, dst, JK_MD5_DIGESTSIZE)); -} - -#else /* USE_APACHE_MD5 */ - -#include "httpd.h" -#include "http_config.h" - -#ifdef STANDARD20_MODULE_STUFF - -#include "apr_md5.h" -#define AP_MD5_CTX apr_md5_ctx_t -#define ap_MD5Init apr_md5_init -#define ap_MD5Update apr_md5_update -#define ap_MD5Final apr_md5_final - -#else /* STANDARD20_MODULE_STUFF */ - -#include "ap_md5.h" - -#endif /* STANDARD20_MODULE_STUFF */ - -char *JK_METHOD jk_md5(const unsigned char *org, const unsigned char *org2, - char *dst) -{ - AP_MD5_CTX ctx; - char buf[JK_MD5_DIGESTSIZE + 1]; - - ap_MD5Init(&ctx); - ap_MD5Update(&ctx, org, strlen((const char *)org)); - - if (org2 != NULL) - ap_MD5Update(&ctx, org2, strlen((const char *)org2)); - - ap_MD5Final((unsigned char *)buf, &ctx); - return (jk_hextocstr((unsigned char *)buf, dst, JK_MD5_DIGESTSIZE)); -} - -#endif /* USE_APACHE_MD5 */ - -/* Test values: - * "" D4 1D 8C D9 8F 00 B2 04 E9 80 09 98 EC F8 42 7E - * "a" 0C C1 75 B9 C0 F1 B6 A8 31 C3 99 E2 69 77 26 61 - * "abc 90 01 50 98 3C D2 4F B0 D6 96 3F 7D 28 E1 7F 72 - * "message digest" F9 6B 69 7D 7C B7 93 8D 52 5A 2F 31 AA F1 61 D0 - * - */ - -#ifdef TEST_JKMD5 - -main(int argc, char **argv) -{ - char xxx[(2 * JK_MD5_DIGESTSIZE) + 1]; - - if (argc > 1) - printf("%s => %s\n", argv[1], jk_md5(argv[1], NULL, xxx)); -} - -#endif diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.h deleted file mode 100644 index f740048b..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.h +++ /dev/null @@ -1,84 +0,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. - */ - -/* - * 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. -*/ - -#ifndef JK_APACHE_MD5_H -#define JK_APACHE_MD5_H - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* MD5.H - header file for MD5.C */ - -#define JK_MD5_DIGESTSIZE 16 - -/* MD5 context. */ -typedef struct -{ - jk_uint32_t state[4]; /* state (ABCD) */ - jk_uint32_t count[2]; /* number of bits, modulo 2^64 (lsb first) */ - unsigned char buffer[64]; /* input buffer */ -} JK_MD5_CTX; - -/* - * Define the Magic String prefix that identifies a password as being - * hashed using our algorithm. - */ -#define JK_MD5PW_ID "$apr1$" -#define JK_MD5PW_IDLEN 6 - -char *JK_METHOD jk_hextocstr(unsigned char *org, char *dst, int n); -char *JK_METHOD jk_md5(const unsigned char *org, - const unsigned char *org2, char *dst); - - -#ifdef __cplusplus -} -#endif - -#endif /* !JK_APACHE_MD5_H */ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.lo deleted file mode 100644 index c6617e56..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.lo +++ /dev/null @@ -1,12 +0,0 @@ -# jk_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/jk_md5.o' - -# Name of the non-PIC object. -non_pic_object='jk_md5.o' - diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.o deleted file mode 100644 index d3a98259..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.c deleted file mode 100644 index 955fd5ab..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.c +++ /dev/null @@ -1,382 +0,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. - */ - -/*************************************************************************** - * Description: Data marshaling. XDR like * - * Author: Costin * - * Author: Gal Shachor * - * Author: Henri Gomez * - * Version: $Revision: 705882 $ * - ***************************************************************************/ - -#include "jk_pool.h" -#include "jk_connect.h" -#include "jk_util.h" -#include "jk_sockbuf.h" -#include "jk_msg_buff.h" -#include "jk_logger.h" - -static char *jk_HEX = "0123456789ABCDEFX"; - -/* - * Simple marshaling code. - */ - -void jk_b_reset(jk_msg_buf_t *msg) -{ - msg->len = 4; - msg->pos = 4; - if (msg->buf && msg->maxlen) { - /* Clear the message buffer */ - memset(msg->buf, 0, msg->maxlen); - } -} - -int jk_b_append_long(jk_msg_buf_t *msg, unsigned long val) -{ - if (msg->len + 4 > msg->maxlen) { - return -1; - } - - msg->buf[msg->len++] = (unsigned char)((val >> 24) & 0xFF); - msg->buf[msg->len++] = (unsigned char)((val >> 16) & 0xFF); - msg->buf[msg->len++] = (unsigned char)((val >> 8) & 0xFF); - msg->buf[msg->len++] = (unsigned char)((val) & 0xFF); - - return 0; -} - - -int jk_b_append_int(jk_msg_buf_t *msg, unsigned short val) -{ - if (msg->len + 2 > msg->maxlen) { - return -1; - } - - msg->buf[msg->len++] = (unsigned char)((val >> 8) & 0xFF); - msg->buf[msg->len++] = (unsigned char)((val) & 0xFF); - - return 0; -} - - -int jk_b_append_byte(jk_msg_buf_t *msg, unsigned char val) -{ - if (msg->len + 1 > msg->maxlen) { - return -1; - } - - msg->buf[msg->len++] = val; - - return 0; -} - - -void jk_b_end(jk_msg_buf_t *msg, int protoh) -{ - /* - * Ugly way to set the size in the right position - */ - int hlen = msg->len - 4; - - msg->buf[0] = (unsigned char)((protoh >> 8) & 0xFF); - msg->buf[1] = (unsigned char)((protoh) & 0xFF); - msg->buf[2] = (unsigned char)((hlen >> 8) & 0xFF); - msg->buf[3] = (unsigned char)((hlen) & 0xFF); - -} - - -jk_msg_buf_t *jk_b_new(jk_pool_t *p) -{ - jk_msg_buf_t *msg = - (jk_msg_buf_t *)jk_pool_alloc(p, sizeof(jk_msg_buf_t)); - - if (!msg) { - return NULL; - } - memset(msg, 0, sizeof(jk_msg_buf_t)); - msg->pool = p; - - return msg; -} - -int jk_b_set_buffer(jk_msg_buf_t *msg, unsigned char *data, int buffSize) -{ - if (!msg) { - return -1; - } - - msg->len = 0; - msg->buf = data; - msg->maxlen = buffSize; - - return 0; -} - - -int jk_b_set_buffer_size(jk_msg_buf_t *msg, int buffSize) -{ - unsigned char *data = (unsigned char *)jk_pool_alloc(msg->pool, buffSize); - - if (!data) { - return -1; - } - - jk_b_set_buffer(msg, data, buffSize); - return 0; -} - -#if defined(AS400) && !defined(AS400_UTF8) -int jk_b_append_asciistring(jk_msg_buf_t *msg, const char *param) -{ - int len; - - if (!param) { - jk_b_append_int(msg, 0xFFFF); - return 0; - } - - len = strlen(param); - if (msg->len + len + 2 > msg->maxlen) { - return -1; - } - - /* ignore error - we checked once */ - jk_b_append_int(msg, (unsigned short)len); - - /* We checked for space !! */ - strncpy((char *)msg->buf + msg->len, param, len + 1); /* including \0 */ - msg->len += len + 1; - - return 0; -} -#endif - -int jk_b_append_string(jk_msg_buf_t *msg, const char *param) -{ - unsigned short len; - - if (!param) { - jk_b_append_int(msg, 0xFFFF); - return 0; - } - - len = (unsigned short)strlen(param); - if (msg->len + len + 3 > msg->maxlen) { - return -1; - } - - /* ignore error - we checked once */ - jk_b_append_int(msg, len); - - /* We checked for space !! */ - memcpy(msg->buf + msg->len, param, len + 1); /* including \0 */ -#if (defined(AS400) && !defined(AS400_UTF8)) || defined(_OSD_POSIX) - /* convert from EBCDIC if needed */ - jk_xlate_to_ascii((char *)msg->buf + msg->len, len + 1); -#endif - msg->len += len + 1; - - return 0; -} - - -int jk_b_append_bytes(jk_msg_buf_t *msg, const unsigned char *param, int len) -{ - if (!len) { - return 0; - } - - if (msg->len + len > msg->maxlen) { - return -1; - } - - /* We checked for space !! */ - memcpy((char *)msg->buf + msg->len, param, len); - msg->len += len; - - return 0; -} - -unsigned long jk_b_get_long(jk_msg_buf_t *msg) -{ - unsigned long i; - if (msg->pos + 3 > msg->len) { - return 0xFFFFFFFF; - } - i = ((msg->buf[(msg->pos++)] & 0xFF) << 24); - i |= ((msg->buf[(msg->pos++)] & 0xFF) << 16); - i |= ((msg->buf[(msg->pos++)] & 0xFF) << 8); - i |= ((msg->buf[(msg->pos++)] & 0xFF)); - return i; -} - -unsigned long jk_b_pget_long(jk_msg_buf_t *msg, int pos) -{ - unsigned long i; - i = ((msg->buf[(pos++)] & 0xFF) << 24); - i |= ((msg->buf[(pos++)] & 0xFF) << 16); - i |= ((msg->buf[(pos++)] & 0xFF) << 8); - i |= ((msg->buf[(pos)] & 0xFF)); - return i; -} - - -unsigned short jk_b_get_int(jk_msg_buf_t *msg) -{ - unsigned short i; - if (msg->pos + 1 > msg->len) { - return 0xFFFF; - } - i = ((msg->buf[(msg->pos++)] & 0xFF) << 8); - i += ((msg->buf[(msg->pos++)] & 0xFF)); - return i; -} - -unsigned short jk_b_pget_int(jk_msg_buf_t *msg, int pos) -{ - unsigned short i; - i = ((msg->buf[pos++] & 0xFF) << 8); - i += ((msg->buf[pos] & 0xFF)); - return i; -} - -unsigned char jk_b_get_byte(jk_msg_buf_t *msg) -{ - unsigned char rc; - if (msg->pos > msg->len) { - return 0xFF; - } - rc = msg->buf[msg->pos++]; - - return rc; -} - -unsigned char jk_b_pget_byte(jk_msg_buf_t *msg, int pos) -{ - return msg->buf[pos]; -} - - -unsigned char *jk_b_get_string(jk_msg_buf_t *msg) -{ - unsigned short size = jk_b_get_int(msg); - int start = msg->pos; - - if ((size == 0xFFFF) || (size + start > msg->maxlen)) { - /* Error of overflow in AJP packet. - * The complete message is probably invalid. - */ - return NULL; - } - - msg->pos += size; - msg->pos++; /* terminating NULL */ - - return (unsigned char *)(msg->buf + start); -} - -int jk_b_get_bytes(jk_msg_buf_t *msg, unsigned char *buf, int len) -{ - int start = msg->pos; - - if ((len < 0) || (len + start > msg->maxlen)) { - return (-1); - } - - memcpy(buf, msg->buf + start, len); - msg->pos += len; - return (len); -} - - - -/** Helpie dump function - */ -void jk_dump_buff(jk_logger_t *l, - const char *file, - int line, const char *funcname, - int level, char *what, jk_msg_buf_t *msg) -{ - int i = 0; - char lb[80]; - char *current; - int j; - int len = msg->len; - - if (l == NULL) - return; - if (l->level != JK_LOG_TRACE_LEVEL && len > 1024) - len = 1024; - - jk_log(l, file, line, funcname, level, - "%s pos=%d len=%d max=%d", - what, msg->pos, msg->len, msg->maxlen); - - for (i = 0; i < len; i += 16) { - current = &lb[0]; - - for (j = 0; j < 16; j++) { - unsigned char x = (msg->buf[i + j]); - if ((i + j) >= len) - x = 0; - *current++ = jk_HEX[x >> 4]; - *current++ = jk_HEX[x & 0x0f]; - *current++ = ' '; - } - *current++ = ' '; - *current++ = '-'; - *current++ = ' '; - for (j = 0; j < 16; j++) { - unsigned char x = msg->buf[i + j]; - if ((i + j) >= len) - x = 0; - if (x > 0x20 && x < 0x7F) { -#ifdef USE_CHARSET_EBCDIC - *current = x; - jk_xlate_from_ascii(current, 1); - current++; -#else - *current++ = x; -#endif - } - else { - *current++ = '.'; - } - } - *current++ = '\0'; - - jk_log(l, file, line, funcname, level, - "%.4x %s", i, lb); - } -} - - -int jk_b_copy(jk_msg_buf_t *smsg, jk_msg_buf_t *dmsg) -{ - if (smsg == NULL || dmsg == NULL) - return (-1); - - if (dmsg->maxlen < smsg->len) - return (-2); - - memcpy(dmsg->buf, smsg->buf, smsg->len); - dmsg->len = smsg->len; - - return (smsg->len); -} diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.h deleted file mode 100644 index 3fdc006b..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.h +++ /dev/null @@ -1,154 +0,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. - */ - -/*************************************************************************** - * Description: Data marshaling. XDR like * - * Author: Costin * - * Author: Gal Shachor * - * Version: $Revision: 530674 $ * - ***************************************************************************/ - -#ifndef JK_MSG_BUF_H -#define JK_MSG_BUF_H - - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -#define DEF_BUFFER_SZ (8 * 1024) - -/* XXX replace all return values with error codes */ -#define ERR_BAD_PACKET -5 - -/* -RPC details: - - - one parameter - use a structure for more. The method - is encoded as part of the request - - one or no result - - - - - - */ - -typedef struct jk_msg_buf_t jk_msg_buf_t; -struct jk_msg_buf_t -{ - jk_pool_t *pool; - unsigned char *buf; - int pos; - int len; - int maxlen; -}; - - -/* -------------------- Setup routines -------------------- */ - -/** Allocate a buffer. - */ -jk_msg_buf_t *jk_b_new(jk_pool_t *p); - -/** Set up a buffer with an existing buffer - */ -int jk_b_set_buffer(jk_msg_buf_t *msg, unsigned char *data, int buffSize); - -/* - * Set up a buffer with a new buffer of buffSize - */ -int jk_b_set_buffer_size(jk_msg_buf_t *msg, int buffSize); - -/* - * Finalize the buffer before sending - set length fields, etc - */ -void jk_b_end(jk_msg_buf_t *msg, int protoh); - -/* - * Recycle the buffer - z for a new invocation - */ -void jk_b_reset(jk_msg_buf_t *msg); - -/* -------------------- Real encoding -------------------- */ - -int jk_b_append_byte(jk_msg_buf_t *msg, unsigned char val); - -int jk_b_append_bytes(jk_msg_buf_t *msg, - const unsigned char *param, int len); - -int jk_b_append_int(jk_msg_buf_t *msg, unsigned short val); - -int jk_b_append_long(jk_msg_buf_t *msg, unsigned long val); - -int jk_b_append_string(jk_msg_buf_t *msg, const char *param); - -#if defined(AS400) && !defined(AS400_UTF8) -int jk_b_append_asciistring(jk_msg_buf_t *msg, const char *param); -#endif - -int jk_b_append_bytes(jk_msg_buf_t *msg, - const unsigned char *param, int len); - -/* -------------------- Decoding -------------------- */ - -/** Get a byte from the current position - */ -unsigned char jk_b_get_byte(jk_msg_buf_t *msg); - -/** Get an int from the current position - */ -unsigned short jk_b_get_int(jk_msg_buf_t *msg); - -/** Get a long from the current position - */ -unsigned long jk_b_get_long(jk_msg_buf_t *msg); - -/** Get a String from the current position - */ -unsigned char *jk_b_get_string(jk_msg_buf_t *msg); - -/** Get Bytes from the current position - */ -int jk_b_get_bytes(jk_msg_buf_t *msg, unsigned char *buf, int len); - -/** Get a byte from an arbitrary position - */ -unsigned char jk_b_pget_byte(jk_msg_buf_t *msg, int pos); - -/** Get an int from an arbitrary position - */ -unsigned short jk_b_pget_int(jk_msg_buf_t *msg, int pos); - -/** Get a long from an arbitrary position - */ -unsigned long jk_b_pget_long(jk_msg_buf_t *msg, int pos); - -/* --------------------- Help ------------------------ */ -void jk_dump_buff(jk_logger_t *l, - const char *file, - int line, const char *funcname, - int level, char *what, jk_msg_buf_t *msg); - -/** Copy a msg buf into another one - */ -int jk_b_copy(jk_msg_buf_t *smsg, jk_msg_buf_t *dmsg); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* JK_MSG_BUF_H */ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.lo deleted file mode 100644 index 8ea86702..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.lo +++ /dev/null @@ -1,12 +0,0 @@ -# jk_msg_buff.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/jk_msg_buff.o' - -# Name of the non-PIC object. -non_pic_object='jk_msg_buff.o' - diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.o deleted file mode 100644 index 3f0a0391..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_mt.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_mt.h deleted file mode 100644 index b5525bb7..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_mt.h +++ /dev/null @@ -1,150 +0,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. - */ - -/*************************************************************************** - * Description: Multi thread portability code for JK * - * Author: Gal Shachor * - * Version: $Revision: 918711 $ * - ***************************************************************************/ - -#ifndef _JK_MT_H -#define _JK_MT_H - -#include "jk_global.h" - - -#if defined(WIN32) -#define jk_gettid() ((jk_uint32_t)GetCurrentThreadId()) -#elif defined(NETWARE) && !defined(__NOVELL_LIBC__) -#define getpid() ((int)GetThreadGroupID()) -#endif - -#ifdef JK_PREFORK -#define _MT_CODE 0 -#else -#define _MT_CODE 1 -#endif - -/* - * Marks execution under MT compilation - */ -#if _MT_CODE -#ifdef WIN32 -#include - -typedef CRITICAL_SECTION JK_CRIT_SEC; -#define JK_INIT_CS(x, rc) InitializeCriticalSection(x); rc = JK_TRUE -#define JK_DELETE_CS(x, rc) DeleteCriticalSection(x); rc = JK_TRUE -#define JK_ENTER_CS(x, rc) EnterCriticalSection(x); rc = JK_TRUE -#define JK_LEAVE_CS(x, rc) LeaveCriticalSection(x); rc = JK_TRUE - -#else /* !WIN32 */ -#define _MT_CODE_PTHREAD -#include -#include -#include - -typedef pthread_mutex_t JK_CRIT_SEC; -#define JK_INIT_CS(x, rc)\ - if(pthread_mutex_init(x, NULL)) rc = JK_FALSE; else rc = JK_TRUE - -#define JK_DELETE_CS(x, rc)\ - if(pthread_mutex_destroy(x)) rc = JK_FALSE; else rc = JK_TRUE - -#define JK_ENTER_CS(x, rc)\ - if(pthread_mutex_lock(x)) rc = JK_FALSE; else rc = JK_TRUE - -#define JK_LEAVE_CS(x, rc)\ - if(pthread_mutex_unlock(x)) rc = JK_FALSE; else rc = JK_TRUE - -#if defined(AS400) || defined(NETWARE) -#define jk_pthread_t jk_uint32_t -#endif /* AS400 || NETWARE */ -jk_pthread_t jk_gettid(void); -#endif /* WIN32 */ - -#else /* !_MT_CODE */ - -typedef void *JK_CRIT_SEC; -#define JK_INIT_CS(x, rc) rc = JK_TRUE -#define JK_DELETE_CS(x, rc) rc = JK_TRUE -#define JK_ENTER_CS(x, rc) rc = JK_TRUE -#define JK_LEAVE_CS(x, rc) rc = JK_TRUE -#define jk_gettid() 0 -#endif /* MT_CODE */ - -#if !defined(WIN32) && !defined(NETWARE) -#include -#include - - -#define USE_FLOCK_LK 0 -#if HAVE_FLOCK -#ifdef JK_USE_FLOCK -#define USE_FLOCK_LK 1 -#endif -#endif - -#if USE_FLOCK_LK -#include - -#define JK_ENTER_LOCK(x, rc) \ - do { \ - while ((rc = flock((x), LOCK_EX) < 0) && (errno == EINTR)); \ - rc = rc == 0 ? JK_TRUE : JK_FALSE; \ - } while (0) - -#define JK_LEAVE_LOCK(x, rc) \ - do { \ - while ((rc = flock((x), LOCK_UN) < 0) && (errno == EINTR)); \ - rc = rc == 0 ? JK_TRUE : JK_FALSE; \ - } while (0) - -#else /* !USE_FLOCK_LK */ - -#define JK_ENTER_LOCK(x, rc) \ - do { \ - struct flock _fl; \ - _fl.l_type = F_WRLCK; \ - _fl.l_whence = SEEK_SET; \ - _fl.l_start = 0; \ - _fl.l_len = 1L; \ - _fl.l_pid = 0; \ - while ((rc = fcntl((x), F_SETLKW, &_fl) < 0) && (errno == EINTR)); \ - rc = rc == 0 ? JK_TRUE : JK_FALSE; \ - } while (0) - -#define JK_LEAVE_LOCK(x, rc) \ - do { \ - struct flock _fl; \ - _fl.l_type = F_UNLCK; \ - _fl.l_whence = SEEK_SET; \ - _fl.l_start = 0; \ - _fl.l_len = 1L; \ - _fl.l_pid = 0; \ - while ((rc = fcntl((x), F_SETLKW, &_fl) < 0) && (errno == EINTR)); \ - rc = rc == 0 ? JK_TRUE : JK_FALSE; \ - } while (0) - -#endif /* USE_FLOCK_LK */ - -#else /* WIN32 || NETWARE */ -#define JK_ENTER_LOCK(x, rc) rc = JK_TRUE -#define JK_LEAVE_LOCK(x, rc) rc = JK_TRUE -#endif - -#endif /* _JK_MT_H */ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_nwmain.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_nwmain.c deleted file mode 100644 index 804de00d..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_nwmain.c +++ /dev/null @@ -1,103 +0,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. - */ - -/*************************************************************************** - * Description: Netware Wrapper * - * Author: Mike Anderson * - * Version: $Revision: 466585 $ * - ***************************************************************************/ - -#ifdef NETWARE -/* - * NATIVE_MAIN - */ - -/* - * INCLUDES - */ - -#include - -/* Apache 2/APR uses NOVELL_LIBC which has a different way of handling - * "library" nlms. If we aren't on LIBC, use the old method - */ - -#ifndef __NOVELL_LIBC__ -#include -#include - -NETDB_DEFINE_CONTEXT -/* - * main () - * - * Main entry point -- don't do much more than I've provided - * - * Entry: - * - * Exit: - * Nothing - */ -void main() -{ - ExitThread(TSR_THREAD, 0); -} -#else /* __NOVELL_LIBC__ */ - -/* Since we are on LibC, we need to handle our own startup and shutdown */ - -#include -#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; -} -#endif /* __NOVELL_LIBC__ */ - -#endif diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.c deleted file mode 100644 index 685f75c6..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.c +++ /dev/null @@ -1,165 +0,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. - */ - -/*************************************************************************** - * Description: Simple memory pool * - * Author: Gal Shachor * - * Version: $Revision: 466585 $ * - ***************************************************************************/ - -#include "jk_pool.h" - -#define DEFAULT_DYNAMIC 10 - - -static void *jk_pool_dyn_alloc(jk_pool_t *p, size_t size); - - -void jk_open_pool(jk_pool_t *p, jk_pool_atom_t *buf, size_t size) -{ - p->pos = 0; - p->size = size; - p->buf = (char *)buf; - - p->dyn_pos = 0; - p->dynamic = NULL; - p->dyn_size = 0; -} - -void jk_close_pool(jk_pool_t *p) -{ - jk_reset_pool(p); - if (p->dynamic) { - free(p->dynamic); - } -} - -void jk_reset_pool(jk_pool_t *p) -{ - if (p->dyn_pos && p->dynamic) { - size_t i; - for (i = 0; i < p->dyn_pos; i++) { - if (p->dynamic[i]) { - free(p->dynamic[i]); - } - } - } - - p->dyn_pos = 0; - p->pos = 0; -} - -void *jk_pool_alloc(jk_pool_t *p, size_t size) -{ - void *rc = NULL; - - size = JK_ALIGN_DEFAULT(size); - if ((p->size - p->pos) >= size) { - rc = &(p->buf[p->pos]); - p->pos += size; - } - else { - rc = jk_pool_dyn_alloc(p, size); - } - - return rc; -} - -void *jk_pool_realloc(jk_pool_t *p, size_t sz, const void *old, size_t old_sz) -{ - void *rc; - - if (!p || (!old && old_sz)) { - return NULL; - } - - rc = jk_pool_alloc(p, sz); - if (rc) { - memcpy(rc, old, old_sz); - } - - return rc; -} - -void *jk_pool_strdup(jk_pool_t *p, const char *s) -{ - void *rc = NULL; - if (s && p) { - size_t size = strlen(s); - - if (!size) { - return ""; - } - - size++; - rc = jk_pool_alloc(p, size); - if (rc) { - memcpy(rc, s, size); - } - } - - return rc; -} - -#if defined (DEBUG) || defined(_DEBUG) -static void jk_dump_pool(jk_pool_t *p, FILE * f) -{ - fprintf(f, "Dumping for pool [%p]\n", p); - fprintf(f, "size [%ld]\n", p->size); - fprintf(f, "pos [%ld]\n", p->pos); - fprintf(f, "buf [%p]\n", p->buf); - fprintf(f, "dyn_size [%ld]\n", p->dyn_size); - fprintf(f, "dyn_pos [%ld]\n", p->dyn_pos); - fprintf(f, "dynamic [%p]\n", p->dynamic); - - fflush(f); -} -#endif - -static void *jk_pool_dyn_alloc(jk_pool_t *p, size_t size) -{ - void *rc; - - if (p->dyn_size == p->dyn_pos) { - size_t new_dyn_size = p->dyn_size * 2 + DEFAULT_DYNAMIC; - void **new_dynamic = (void **)malloc(new_dyn_size * sizeof(void *)); - if (new_dynamic) { - if (p->dynamic) { - /* Copy old dynamic slots */ - memcpy(new_dynamic, p->dynamic, p->dyn_size * sizeof(void *)); - - free(p->dynamic); - } - - p->dynamic = new_dynamic; - p->dyn_size = new_dyn_size; - } - else { -#if defined (DEBUG) || defined(_DEBUG) - jk_dump_pool(p, stderr); -#endif - return NULL; - } - } - - rc = p->dynamic[p->dyn_pos] = malloc(size); - if (p->dynamic[p->dyn_pos]) { - p->dyn_pos++; - } - - return rc; -} diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.h deleted file mode 100644 index b4c582df..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.h +++ /dev/null @@ -1,126 +0,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. - */ - -/*************************************************************************** - * Description: Memory Pool object header file * - * Author: Gal Shachor * - * Version: $Revision: 466585 $ * - ***************************************************************************/ -#ifndef _JK_POOL_H -#define _JK_POOL_H - -#include "jk_global.h" - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -/** - * @file jk_pool.h - * @brief Jk memory allocation - * - * Similar with apr_pools, but completely unsynchronized. - * XXX use same names - * - */ - -/* - * The pool atom (basic pool alocation unit) is an 8 byte long. - * Each allocation (even for 1 byte) will return a round up to the - * number of atoms. - * - * This is to help in alignment of 32/64 bit machines ... - * G.S - */ -#ifdef WIN32 - typedef __int64 jk_pool_atom_t; -#elif defined(AIX) - typedef long long jk_pool_atom_t; -#elif defined(SOLARIS) - typedef long long jk_pool_atom_t; -#elif defined(LINUX) - typedef long long jk_pool_atom_t; -#elif defined(FREEBSD) - typedef long long jk_pool_atom_t; -#elif defined(OS2) - typedef long long jk_pool_atom_t; -#elif defined(NETWARE) - typedef long long jk_pool_atom_t; -#elif defined(HPUX11) - typedef long long jk_pool_atom_t; -#elif defined(IRIX) - typedef long long jk_pool_atom_t; -#elif defined(AS400) - typedef void *jk_pool_atom_t; -#else - typedef long long jk_pool_atom_t; -#endif - -/** - * Alignment macros - */ - -/* JK_ALIGN() is only to be used to align on a power of 2 boundary */ -#define JK_ALIGN(size, boundary) \ - (((size) + ((boundary) - 1)) & ~((boundary) - 1)) - -/** Default alignment */ -#ifdef AS400 -#define JK_ALIGN_DEFAULT(size) JK_ALIGN(size, 16) -#else -#define JK_ALIGN_DEFAULT(size) JK_ALIGN(size, 8) -#endif - -/* - * Pool size in number of pool atoms. - */ -#define TINY_POOL_SIZE 256 /* Tiny 1/4K atom pool. */ -#define SMALL_POOL_SIZE 512 /* Small 1/2K atom pool. */ -#define BIG_POOL_SIZE 2*SMALL_POOL_SIZE /* Bigger 1K atom pool. */ -#define HUGE_POOL_SIZE 2*BIG_POOL_SIZE /* Huge 2K atom pool. */ - -/** jk pool structure */ -struct jk_pool -{ - size_t size; - size_t pos; - char *buf; - size_t dyn_size; - size_t dyn_pos; - void **dynamic; -}; - -typedef struct jk_pool jk_pool_t; - -void jk_open_pool(jk_pool_t *p, jk_pool_atom_t *buf, size_t size); - -void jk_close_pool(jk_pool_t *p); - -void jk_reset_pool(jk_pool_t *p); - -void *jk_pool_alloc(jk_pool_t *p, size_t sz); - -void *jk_pool_realloc(jk_pool_t *p, - size_t sz, const void *old, size_t old_sz); - -void *jk_pool_strdup(jk_pool_t *p, const char *s); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* _JK_POOL_H */ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.lo deleted file mode 100644 index 490290d5..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.lo +++ /dev/null @@ -1,12 +0,0 @@ -# jk_pool.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/jk_pool.o' - -# Name of the non-PIC object. -non_pic_object='jk_pool.o' - diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.o deleted file mode 100644 index e2e72173..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_service.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_service.h deleted file mode 100644 index e99e774b..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_service.h +++ /dev/null @@ -1,546 +0,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. - */ - -/*************************************************************************** - * Description: Definitions of the objects used during the service step. * - * These are the web server (ws) the worker and the connection* - * JVM connection point * - * Author: Gal Shachor * - * Author: Dan Milstein * - * Author: Henri Gomez * - * Version: $Revision: 1078846 $ * - ***************************************************************************/ - -#ifndef JK_SERVICE_H -#define JK_SERVICE_H - -#include "jk_global.h" -#include "jk_logger.h" -#include "jk_pool.h" -#include "jk_map.h" -#include "jk_uri_worker_map.h" -#include "jk_msg_buff.h" - -#define JK_RETRIES 2 - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -/* - * Env Information to be provided to worker at init time - * With AJP14 support we need to have access to many informations - * about web-server, uri to worker map.... - */ - -struct jk_worker_env -{ - - /* The original configuration map */ - jk_map_t *init_data; - - /* The URI to WORKER map, will be feeded by AJP14 autoconf feature */ - jk_uri_worker_map_t *uri_to_worker; - - unsigned int num_of_workers; - char **worker_list; - - /* Web-Server we're running on (Apache/IIS/NES) */ - char *server_name; - - /* Virtual server handled - "*" is all virtual */ - char *virtual; - - /* Optional APR pool used for configuration */ - void *pool; -}; -typedef struct jk_worker_env jk_worker_env_t; - -struct jk_ws_service; -struct jk_endpoint; -struct jk_worker; -typedef struct jk_ws_service jk_ws_service_t; -typedef struct jk_endpoint jk_endpoint_t; -typedef struct jk_worker jk_worker_t; - -struct svc_extension -{ - /* reply_timeout overwrite */ - int reply_timeout; - /* activation state overwrites for load balancers */ - /* Dynamically allocated array with one entry per lb member. */ - int *activation; - /* fail_on_status overwrites */ - /* Number of elements in the array fail_on_status. */ - int fail_on_status_size; - /* Dynamically allocated array with one entry per status. */ - int *fail_on_status; - /* Use server error pages for responses >= 400. */ - int use_server_error_pages; -}; -typedef struct svc_extension svc_extension_t; - -/* - * The web server service 'class'. An instance of this class is created - * for each request which is forwarded from the web server to the servlet - * container. Contains the basic information about the request - * (e.g. protocol, req_uri, etc), and also contains a series of methods - * which provide access to core web server functionality (start_response, - * read, write). This class might be more accurately called ws_request. - * - * As with all the core jk classes, this is essentially an abstract base - * class which is implemented/extended by classes which are specific to a - * particular web server. By using an abstract base class in this manner, - * workers can be written for different protocols (e.g. ajp12, ajp13, ajp14) - * without the workers having to worry about which web server they are - * talking to. - * - * This particular OO-in-C system uses a 'ws_private' pointer to point to - * the platform-specific data. So in the subclasses, the methods do most - * of their work by getting their hands on the ws_private pointer and then - * using that to get at the correctly formatted data and functions for - * their platform. - * - * Try imagining this as a 'public abstract class', and the ws_private - * pointer as a sort of extra 'this' reference. Or imagine that you are - * seeing the internal vtables of your favorite OO language. Whatever - * works for you. - * - * See apache1.3/mod_jk.c and iis/jk_isapi_plugin.c for examples. - */ -struct jk_ws_service -{ - - /* - * A 'this' pointer which is used by the subclasses of this class to - * point to data which is specific to a given web server platform - * (e.g. Apache or IIS). - */ - void *ws_private; - - /* - * Provides memory management. All data specific to this request is - * allocated within this pool, which can then be reclaimed at the end - * of the request handling cycle. - * - * Alive as long as the request is alive. - */ - jk_pool_t *pool; - - /* - * CGI Environment needed by servlets - */ - const char *method; - const char *protocol; - char *req_uri; - const char *remote_addr; - const char *remote_port; - const char *remote_host; - const char *remote_user; - const char *auth_type; - const char *query_string; - const char *server_name; - unsigned server_port; - char *server_software; - jk_uint64_t content_length; /* 64 bit integer that represents the content */ - /* length should be 0 if unknown. */ - unsigned is_chunked; /* 1 if content length is unknown (chunked rq) */ - unsigned no_more_chunks; /* 1 if last chunk has been read */ - jk_uint64_t content_read; /* number of bytes read */ - - /* - * SSL information - * - * is_ssl - True if request is in ssl connection - * ssl_cert - If available, base64 ASN.1 encoded client certificates. - * ssl_cert_len - Length of ssl_cert, 0 if certificates are not available. - * ssl_cipher - The ssl cipher suite in use. - * ssl_session - The ssl session string - * - * In some servers it is impossible to extract all this information, in this - * case, we are passing NULL. - */ - int is_ssl; - char *ssl_cert; - unsigned ssl_cert_len; - char *ssl_cipher; - char *ssl_session; - - /* - * SSL extra information for Servlet 2.3 API - * - * ssl_key_size - ssl key size in use - */ - int ssl_key_size; - - /* - * Headers, names and values. - */ - char **headers_names; /* Names of the request headers */ - char **headers_values; /* Values of the request headers */ - unsigned num_headers; /* Number of request headers */ - - - /* - * Request attributes. - * - * These attributes that were extracted from the web server and are - * sent to Tomcat. - * - * The developer should be able to read them from the ServletRequest - * attributes. Tomcat is required to append org.apache.tomcat. to - * these attrinbute names. - */ - char **attributes_names; /* Names of the request attributes */ - char **attributes_values; /* Values of the request attributes */ - unsigned num_attributes; /* Number of request attributes */ - - /* - * The route is in use when the adapter load balance among - * several workers. It is the ID of a specific target in the load balance - * group. We are using this variable to implement target session - * affinity - */ - const char *route; - - /* - * Activation state of the worker in the load balancer. - * Will be forwarded as a request attribute. - */ - const char *activation; - - /* Temp solution for auth. For native1 it'll be sent on each request, - if an option is present. For native2 it'll be sent with the first - request. On java side, both cases will work. For tomcat3.2 or - a version that doesn't support secret - don't set the secret, - and it'll work. - */ - const char *secret; - - /* - * Area to get POST data for fail-over recovery in POST - */ - jk_msg_buf_t *reco_buf; - int reco_status; - - /* - * If set call flush after each write - */ - int flush_packets; - - /* - * If set call flush after AJP13_SEND_HEADERS. - */ - int flush_header; - - /* - * service extensions - */ - svc_extension_t extension; - - /* - * JK_TRUE if response headers have been sent back - */ - int response_started; - - /* - * JK_TRUE if response should not be send to the client - */ - int response_blocked; - - /* - * HTTP status sent from container. - */ - int http_response_status; - - /* Uri worker map. Added for virtual host support - */ - jk_uri_worker_map_t *uw_map; - - /* - * Callbacks into the web server. For each, the first argument is - * essentially a 'this' pointer. All return JK_TRUE on success - * and JK_FALSE on failure. - */ - /* - * Send the response headers to the browser. - */ - int (JK_METHOD * start_response) (jk_ws_service_t *s, - int status, - const char *reason, - const char *const *header_names, - const char *const *header_values, - unsigned num_of_headers); - - /* - * Read a chunk of the request body into a buffer. Attempt to read len - * bytes into the buffer. Write the number of bytes actually read into - * actually_read. - */ - int (JK_METHOD * read) (jk_ws_service_t *s, - void *buffer, - unsigned len, unsigned *actually_read); - - /* - * Write a chunk of response data back to the browser. - */ - int (JK_METHOD * write) (jk_ws_service_t *s, - const void *buffer, unsigned len); - - /* - * Flush a chunk of response data back to the browser. - */ - void (JK_METHOD * flush) (jk_ws_service_t *s); - - /* - * Done with sending response back to the browser. - */ - void (JK_METHOD * done) (jk_ws_service_t *s); - - /* - * If set do not reuse socket after each full response - */ - int disable_reuse; - - /* - * Add more data to log facilities. - */ - void (JK_METHOD * add_log_items) (jk_ws_service_t *s, - const char *const *log_names, - const char *const *log_values, - unsigned num_of_items); - - /* - * Iterate through all vhosts - */ - void *(JK_METHOD * next_vhost) (void *d); - - /* - * String representation of a vhost - */ - void (JK_METHOD * vhost_to_text) (void *d, char *buf, size_t len); - - /* - * Get uw_map associated with a vhost - */ - jk_uri_worker_map_t *(JK_METHOD * vhost_to_uw_map) (void *d); -}; - -/* - * The endpoint 'class', which represents one end of a connection to the - * servlet engine. Basically, supports nothing other than forwarding the - * request to the servlet engine. Endpoints can be persistent (as with - * ajp13/ajp14, where a single connection is reused many times), or can last for a - * single request (as with ajp12, where a new connection is created for - * every request). - * - * An endpoint for a given protocol is obtained by the web server plugin - * from a worker object for that protocol. See below for details. - * - * As with all the core jk classes, this is essentially an abstract base - * class which is implemented/extended by classes which are specific to a - * particular protocol. By using an abstract base class in this manner, - * plugins can be written for different servers (e.g. IIS, Apache) without - * the plugins having to worry about which protocol they are talking. - * - * This particular OO-in-C system uses a 'endpoint_private' pointer to - * point to the protocol-specific data/functions. So in the subclasses, the - * methods do most of their work by getting their hands on the - * endpoint_private pointer and then using that to get at the functions for - * their protocol. - * - * Try imagining this as a 'public abstract class', and the - * endpoint_private pointer as a sort of extra 'this' reference. Or - * imagine that you are seeing the internal vtables of your favorite OO - * language. Whatever works for you. - * - * See jk_ajp13_worker.c/jk_ajp14_worker.c and jk_ajp12_worker.c for examples. - */ -struct jk_endpoint -{ - jk_uint64_t rd; - jk_uint64_t wr; - - /* - * Flag to pass back recoverability status from - * a load balancer member to the load balancer itself. - * Depending on the configuration and request status - * recovery is not allowed. - */ - int recoverable; - - /* - * A 'this' pointer which is used by the subclasses of this class to - * point to data/functions which are specific to a given protocol - * (e.g. ajp12 or ajp13 or ajp14). - */ - void *endpoint_private; - - /* - * Forward a request to the servlet engine. The request is described - * by the jk_ws_service_t object. - * is_error is either 0 meaning recoverable or set to - * the HTTP error code. - */ - int (JK_METHOD * service) (jk_endpoint_t *e, - jk_ws_service_t *s, - jk_logger_t *l, int *is_error); - - /* - * Called when this particular endpoint has finished processing a - * request. For some protocols (e.g. ajp12), this frees the memory - * associated with the endpoint. For others (e.g. ajp13/ajp14), this can - * return the endpoint to a cache of already opened endpoints. - * - * Note that the first argument is *not* a 'this' pointer, but is - * rather a pointer to a 'this' pointer. This is necessary, because - * we may need to free this object. - */ - int (JK_METHOD * done) (jk_endpoint_t **p, jk_logger_t *l); -}; - -/* - * The worker 'class', which represents something to which the web server - * can delegate requests. - * - * This can mean communicating with a particular servlet engine instance, - * using a particular protocol. A single web server instance may have - * multiple workers communicating with a single servlet engine (it could be - * using ajp12 for some requests and ajp13/ajp14 for others). Or, a single web - * server instance could have multiple workers communicating with different - * servlet engines using the same protocol (it could be load balancing - * among many engines, using ajp13/ajp14 for all communication). - * - * There is also a load balancing worker (jk_lb_worker.c), which itself - * manages a group of workers. - * - * Web servers are configured to forward requests to a given worker. To - * handle those requests, the worker's get_endpoint method is called, and - * then the service() method of that endpoint is called. - * - * As with all the core jk classes, this is essentially an abstract base - * class which is implemented/extended by classes which are specific to a - * particular protocol (or request-handling system). By using an abstract - * base class in this manner, plugins can be written for different servers - * (e.g. IIS, Apache) without the plugins having to worry about which - * protocol they are talking. - * - * This particular OO-in-C system uses a 'worker_private' pointer to - * point to the protocol-specific data/functions. So in the subclasses, the - * methods do most of their work by getting their hands on the - * worker_private pointer and then using that to get at the functions for - * their protocol. - * - * Try imagining this as a 'public abstract class', and the - * worker_private pointer as a sort of extra 'this' reference. Or - * imagine that you are seeing the internal vtables of your favorite OO - * language. Whatever works for you. - * - * See jk_ajp14_worker.c, jk_ajp13_worker.c and jk_ajp12_worker.c for examples. - */ -struct jk_worker -{ - - jk_worker_env_t *we; - - /* - * A 'this' pointer which is used by the subclasses of this class to - * point to data/functions which are specific to a given protocol - * (e.g. ajp12 or ajp13 or ajp14). - */ - void *worker_private; - - int type; - /* - * For all of the below (except destroy), the first argument is - * essentially a 'this' pointer. - */ - - /* - * Given a worker which is in the process of being created, and a list - * of configuration options (or 'properties'), check to see if it the - * options are. This will always be called before the init() method. - * The init/validate distinction is a bit hazy to me. - * See jk_ajp13_worker.c/jk_ajp14_worker.c and jk_worker.c->wc_create_worker() - */ - int (JK_METHOD * validate) (jk_worker_t *w, - jk_map_t *props, - jk_worker_env_t *we, jk_logger_t *l); - - /* - * Update worker either from jk_status or reloading from workers.properties - */ - int (JK_METHOD * update) (jk_worker_t *w, - jk_map_t *props, - jk_worker_env_t *we, jk_logger_t *l); - - /* - * Do whatever initialization needs to be done to start this worker up. - * Configuration options are passed in via the props parameter. - */ - int (JK_METHOD * init) (jk_worker_t *w, - jk_map_t *props, - jk_worker_env_t *we, jk_logger_t *l); - - - /* - * Obtain an endpoint to service a particular request. A pointer to - * the endpoint is stored in pend. - */ - int (JK_METHOD * get_endpoint) (jk_worker_t *w, - jk_endpoint_t **pend, jk_logger_t *l); - - /* - * Shutdown this worker. The first argument is not a 'this' pointer, - * but rather a pointer to 'this', so that the object can be free'd (I - * think -- though that doesn't seem to be happening. Hmmm). - */ - int (JK_METHOD * destroy) (jk_worker_t **w, jk_logger_t *l); - - /* - * Maintain this worker. - */ - int (JK_METHOD * maintain) (jk_worker_t *w, time_t now, jk_logger_t *l); - -}; - -/* - * Essentially, an abstract base class (or factory class) with a single - * method -- think of it as createWorker() or the Factory Method Design - * Pattern. There is a different worker_factory function for each of the - * different types of workers. The set of all these functions is created - * at startup from the list in jk_worker_list.h, and then the correct one - * is chosen in jk_worker.c->wc_create_worker(). See jk_worker.c and - * jk_ajp13_worker.c/jk_ajp14_worker.c for examples. - * - * This allows new workers to be written without modifing the plugin code - * for the various web servers (since the only link is through - * jk_worker_list.h). - */ -typedef int (JK_METHOD * worker_factory) (jk_worker_t **w, - const char *name, - jk_logger_t *l); - -void jk_init_ws_service(jk_ws_service_t *s); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* JK_SERVICE_H */ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.c deleted file mode 100644 index 1640f474..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.c +++ /dev/null @@ -1,812 +0,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. - */ - -/*************************************************************************** - * Description: Shared Memory support * - * Author: Mladen Turk * - * Author: Rainer Jung * - * Version: $Revision: 704548 $ * - ***************************************************************************/ - -#include "jk_global.h" -#include "jk_pool.h" -#include "jk_util.h" -#include "jk_mt.h" -#include "jk_lb_worker.h" -#include "jk_ajp13_worker.h" -#include "jk_ajp14_worker.h" -#include "jk_shm.h" - -/** jk shm header core data structure */ -struct jk_shm_header_data -{ - /* Shared memory magic JK_SHM_MAGIC */ - char magic[JK_SHM_MAGIC_SIZ]; - size_t size; - size_t pos; - unsigned int childs; - unsigned int workers; - time_t modified; -}; - -typedef struct jk_shm_header_data jk_shm_header_data_t; - -/** jk shm header record structure */ -struct jk_shm_header -{ - union { - jk_shm_header_data_t data; - char alignbuf[JK_SHM_ALIGN(sizeof(jk_shm_header_data_t))]; - } h; - char buf[1]; -}; - -typedef struct jk_shm_header jk_shm_header_t; - -/** jk shm structure */ -struct jk_shm -{ - size_t size; - unsigned ajp_workers; - unsigned lb_sub_workers; - unsigned lb_workers; - char *filename; - char *lockname; - int fd; - int fd_lock; - int attached; - jk_shm_header_t *hdr; - JK_CRIT_SEC cs; -}; - -typedef struct jk_shm jk_shm_t; - -static const char shm_signature[] = { JK_SHM_MAGIC }; -static jk_shm_t jk_shmem = { 0, 0, 0, 0, NULL, NULL, -1, -1, 0, NULL}; -static time_t jk_workers_modified_time = 0; -static time_t jk_workers_access_time = 0; -#if defined (WIN32) -static HANDLE jk_shm_map = NULL; -static HANDLE jk_shm_hlock = NULL; -#endif - -/* Calculate needed shm size */ -size_t jk_shm_calculate_size(jk_map_t *init_data, jk_logger_t *l) -{ - char **worker_list; - unsigned i; - unsigned num_of_workers; - int num_of_ajp_workers = 0; - int num_of_lb_sub_workers = 0; - int num_of_lb_workers = 0; - - JK_TRACE_ENTER(l); - - if (jk_get_worker_list(init_data, &worker_list, - &num_of_workers) == JK_FALSE) { - jk_log(l, JK_LOG_ERROR, - "Could not get worker list from map"); - JK_TRACE_EXIT(l); - return 0; - } - - for (i = 0; i < num_of_workers; i++) { - const char *type = jk_get_worker_type(init_data, worker_list[i]); - - if (!strcmp(type, JK_AJP13_WORKER_NAME) || - !strcmp(type, JK_AJP14_WORKER_NAME)) { - num_of_ajp_workers++; - } - else if (!strcmp(type, JK_LB_WORKER_NAME)) { - char **member_list; - unsigned num_of_members; - num_of_lb_workers++; - if (jk_get_lb_worker_list(init_data, worker_list[i], - &member_list, &num_of_members) == JK_FALSE) { - jk_log(l, JK_LOG_ERROR, - "Could not get member list for lb worker from map"); - } - else { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, "worker %s of type %s has %u members", - worker_list[i], JK_LB_WORKER_NAME, num_of_members); - num_of_lb_sub_workers += num_of_members; - } - } - } - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, "shared memory will contain %d ajp workers of size %d and %d lb workers of size %d with %d members of size %d+%d", - num_of_ajp_workers, JK_SHM_AJP_SIZE(1), - num_of_lb_workers, JK_SHM_LB_SIZE(1), - num_of_lb_sub_workers, JK_SHM_LB_SUB_SIZE(1), JK_SHM_AJP_SIZE(1)); - jk_shmem.ajp_workers = num_of_ajp_workers; - jk_shmem.lb_sub_workers = num_of_lb_sub_workers; - jk_shmem.lb_workers = num_of_lb_workers; - JK_TRACE_EXIT(l); - return JK_SHM_AJP_SIZE(jk_shmem.ajp_workers) + - JK_SHM_LB_SUB_SIZE(jk_shmem.lb_sub_workers) + - JK_SHM_AJP_SIZE(jk_shmem.lb_sub_workers) + - JK_SHM_LB_SIZE(jk_shmem.lb_workers); -} - - -#if defined (WIN32) || defined(NETWARE) - -/* Use plain memory */ -int jk_shm_open(const char *fname, size_t sz, jk_logger_t *l) -{ - int rc; - int attached = 0; - char lkname[MAX_PATH]; - JK_TRACE_ENTER(l); - if (jk_shmem.hdr) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, "Shared memory is already opened"); - JK_TRACE_EXIT(l); - return 0; - } - - jk_shmem.size = JK_SHM_ALIGN(sizeof(jk_shm_header_t) + sz); - -#if defined (WIN32) - if (fname) { - jk_shm_map = CreateFileMapping(INVALID_HANDLE_VALUE, - NULL, - PAGE_READWRITE, - 0, - (DWORD)(sizeof(jk_shm_header_t) + sz), - fname); - if (GetLastError() == ERROR_ALREADY_EXISTS) { - attached = 1; - if (jk_shm_map == NULL || jk_shm_map == INVALID_HANDLE_VALUE) { - jk_shm_map = OpenFileMapping(PAGE_READWRITE, FALSE, fname); - } - } - if (jk_shm_map == NULL || jk_shm_map == INVALID_HANDLE_VALUE) { - JK_TRACE_EXIT(l); - return -1; - } - sprintf(lkname, "Global\\%s_MUTEX", fname); - if (attached) { - jk_shm_hlock = OpenMutex(MUTEX_ALL_ACCESS, FALSE, lkname); - } - else { - jk_shm_hlock = CreateMutex(NULL, FALSE, lkname); - } - if (jk_shm_hlock == NULL || jk_shm_hlock == INVALID_HANDLE_VALUE) { - CloseHandle(jk_shm_map); - jk_shm_map = NULL; - JK_TRACE_EXIT(l); - return -1; - } - jk_shmem.hdr = (jk_shm_header_t *)MapViewOfFile(jk_shm_map, - FILE_MAP_ALL_ACCESS, - 0, - 0, - 0); - } - else -#endif - jk_shmem.hdr = (jk_shm_header_t *)calloc(1, jk_shmem.size); - if (!jk_shmem.hdr) { -#if defined (WIN32) - if (jk_shm_map) { - CloseHandle(jk_shm_map); - jk_shm_map = NULL; - } - if (jk_shm_hlock) { - CloseHandle(jk_shm_hlock); - jk_shm_hlock = NULL; - } -#endif - JK_TRACE_EXIT(l); - return -1; - } - if (!jk_shmem.filename) { - if (fname) - jk_shmem.filename = strdup(fname); - else - jk_shmem.filename = strdup("memory"); - } - jk_shmem.fd = 0; - jk_shmem.attached = attached; - if (!attached) { - memcpy(jk_shmem.hdr->h.data.magic, shm_signature, - JK_SHM_MAGIC_SIZ); - jk_shmem.hdr->h.data.size = sz; - jk_shmem.hdr->h.data.childs = 1; - } - else { - jk_shmem.hdr->h.data.childs++; - /* - * Reset the shared memory so that - * alloc works even for attached memory. - * XXX: This might break already used memory - * if the number of workers change between - * open and attach or between two attach operations. - */ - if (jk_shmem.hdr->h.data.childs > 1) { - if (JK_IS_DEBUG_LEVEL(l)) { - jk_log(l, JK_LOG_DEBUG, - "Resetting the shared memory for child %d", - jk_shmem.hdr->h.data.childs); - } - } - jk_shmem.hdr->h.data.pos = 0; - jk_shmem.hdr->h.data.workers = 0; - } - JK_INIT_CS(&(jk_shmem.cs), rc); - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "%s shared memory %s size=%u free=%u addr=%#lx", - attached ? "Attached" : "Initialized", - jk_shm_name(), jk_shmem.size, - jk_shmem.hdr->h.data.size - jk_shmem.hdr->h.data.pos, - jk_shmem.hdr); - JK_TRACE_EXIT(l); - return 0; -} - -int jk_shm_attach(const char *fname, size_t sz, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - if (!jk_shm_open(fname, sz, l)) { - if (!jk_shmem.attached) { - jk_shmem.attached = 1; - if (JK_IS_DEBUG_LEVEL(l)) { - jk_log(l, JK_LOG_DEBUG, - "Attached shared memory %s [%d] size=%u free=%u addr=%#lx", - jk_shm_name(), jk_shmem.hdr->h.data.childs, jk_shmem.size, - jk_shmem.hdr->h.data.size - jk_shmem.hdr->h.data.pos, - jk_shmem.hdr); - } - } - JK_TRACE_EXIT(l); - return 0; - } - else { - JK_TRACE_EXIT(l); - return -1; - } -} - -void jk_shm_close() -{ - if (jk_shmem.hdr) { - int rc; -#if defined (WIN32) - if (jk_shm_hlock) { - CloseHandle(jk_shm_hlock); - jk_shm_hlock = NULL; - } - if (jk_shm_map) { - --jk_shmem.hdr->h.data.childs; - UnmapViewOfFile(jk_shmem.hdr); - CloseHandle(jk_shm_map); - jk_shm_map = NULL; - } - else -#endif - free(jk_shmem.hdr); - JK_DELETE_CS(&(jk_shmem.cs), rc); - } - jk_shmem.hdr = NULL; - if (jk_shmem.filename) { - free(jk_shmem.filename); - jk_shmem.filename = NULL; - } -} - -#else - -#include -#include -#include -#include -#include -#include - -#ifndef MAP_FAILED -#define MAP_FAILED (-1) -#endif - -#ifndef MAP_FILE -#define MAP_FILE (0) -#endif - -static int do_shm_open_lock(const char *fname, int attached, jk_logger_t *l) -{ - int rc; - char flkname[256]; -#ifdef AS400_UTF8 - char *wptr; -#endif - - JK_TRACE_ENTER(l); - - if (attached && jk_shmem.lockname) { -#ifdef JK_SHM_LOCK_REOPEN - jk_shmem.fd_lock = open(jk_shmem.lockname, O_RDWR, 0666); -#else - errno = EINVAL; -#endif - if (jk_shmem.fd_lock == -1) { - rc = errno; - JK_TRACE_EXIT(l); - return rc; - } - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Duplicated shared memory lock %s", jk_shmem.lockname); - JK_TRACE_EXIT(l); - return 0; - } - - if (!jk_shmem.lockname) { -#ifdef JK_SHM_LOCK_REOPEN - int i; - jk_shmem.fd_lock = -1; - mode_t mask = umask(0); - for (i = 0; i < 8; i++) { - strcpy(flkname, "/tmp/jkshmlock.XXXXXX"); - if (mktemp(flkname)) { - jk_shmem.fd_lock = open(flkname, O_RDWR|O_CREAT|O_TRUNC, 0666); - if (jk_shmem.fd_lock >= 0) - break; - } - } - umask(mask); -#else - strcpy(flkname, fname); - strcat(flkname, ".lock"); -#ifdef AS400_UTF8 - wptr = (char *)malloc(strlen(flkname) + 1); - jk_ascii2ebcdic((char *)flkname, wptr); - jk_shmem.fd_lock = open(wptr, O_RDWR|O_CREAT|O_TRUNC, 0666); - free(wptr); -#else - jk_shmem.fd_lock = open(flkname, O_RDWR|O_CREAT|O_TRUNC, 0666); -#endif -#endif - if (jk_shmem.fd_lock == -1) { - rc = errno; - JK_TRACE_EXIT(l); - return rc; - } - jk_shmem.lockname = strdup(flkname); - } - else { - /* Nothing to do */ - JK_TRACE_EXIT(l); - return 0; - } - - if (ftruncate(jk_shmem.fd_lock, 1)) { - rc = errno; - close(jk_shmem.fd_lock); - jk_shmem.fd_lock = -1; - JK_TRACE_EXIT(l); - return rc; - } - if (lseek(jk_shmem.fd_lock, 0, SEEK_SET) != 0) { - rc = errno; - close(jk_shmem.fd_lock); - jk_shmem.fd_lock = -1; - return rc; - } - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Opened shared memory lock %s", jk_shmem.lockname); - JK_TRACE_EXIT(l); - return 0; -} - -static int do_shm_open(const char *fname, int attached, - size_t sz, jk_logger_t *l) -{ - int rc; - int fd; - void *base; -#ifdef AS400_UTF8 - char *wptr; -#endif - - JK_TRACE_ENTER(l); - if (jk_shmem.hdr) { - /* Probably a call from vhost */ - if (!attached) - attached = 1; - } - else if (attached) { - /* We should already have a header - * Use memory if we don't - */ - JK_TRACE_EXIT(l); - return 0; - } - jk_shmem.size = JK_SHM_ALIGN(sizeof(jk_shm_header_t) + sz); - - if (!fname) { - /* Use plain memory in case there is no file name */ - if (!jk_shmem.filename) - jk_shmem.filename = strdup("memory"); - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Using process memory as shared memory"); - JK_TRACE_EXIT(l); - return 0; - } - - if (!jk_shmem.filename) { - jk_shmem.filename = (char *)malloc(strlen(fname) + 32); - sprintf(jk_shmem.filename, "%s.%" JK_PID_T_FMT, fname, getpid()); - } - if (!attached) { - size_t size; - jk_shmem.attached = 0; -#ifdef AS400_UTF8 - wptr = (char *)malloc(strlen(jk_shmem.filename) + 1); - jk_ascii2ebcdic((char *)jk_shmem.filename, wptr); - fd = open(wptr, O_RDWR|O_CREAT|O_TRUNC, 0666); - free(wptr); -#else - fd = open(jk_shmem.filename, O_RDWR|O_CREAT|O_TRUNC, 0666); -#endif - if (fd == -1) { - jk_shmem.size = 0; - JK_TRACE_EXIT(l); - return errno; - } - size = lseek(fd, 0, SEEK_END); - if (size < jk_shmem.size) { - size = jk_shmem.size; - if (ftruncate(fd, jk_shmem.size)) { - rc = errno; - close(fd); -#ifdef AS400_UTF8 - wptr = (char *)malloc(strlen(jk_shmem.filename) + 1); - jk_ascii2ebcdic((char *)jk_shmem.filename, wptr); - unlink(wptr); - free(wptr); -#else - unlink(jk_shmem.filename); -#endif - jk_shmem.size = 0; - JK_TRACE_EXIT(l); - return rc; - } - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Truncated shared memory to %u", size); - } - if (lseek(fd, 0, SEEK_SET) != 0) { - rc = errno; - close(fd); -#ifdef AS400_UTF8 - wptr = (char *)malloc(strlen(jk_shmem.filename) + 1); - jk_ascii2ebcdic((char *)jk_shmem.filename, wptr); - unlink(wptr); - free(wptr); -#else - unlink(jk_shmem.filename); -#endif - jk_shmem.size = 0; - JK_TRACE_EXIT(l); - return rc; - } - - base = mmap((caddr_t)0, jk_shmem.size, - PROT_READ | PROT_WRITE, - MAP_FILE | MAP_SHARED, - fd, 0); - if (base == (caddr_t)MAP_FAILED || base == (caddr_t)0) { - rc = errno; - close(fd); -#ifdef AS400_UTF8 - wptr = (char *)malloc(strlen(jk_shmem.filename) + 1); - jk_ascii2ebcdic((char *)jk_shmem.filename, wptr); - unlink(wptr); - free(wptr); -#else - unlink(jk_shmem.filename); -#endif - jk_shmem.size = 0; - JK_TRACE_EXIT(l); - return rc; - } - jk_shmem.hdr = base; - jk_shmem.fd = fd; - memset(jk_shmem.hdr, 0, jk_shmem.size); - memcpy(jk_shmem.hdr->h.data.magic, shm_signature, JK_SHM_MAGIC_SIZ); - jk_shmem.hdr->h.data.size = sz; - jk_shmem.hdr->h.data.childs = 1; - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Initialized shared memory %s size=%u free=%u addr=%#lx", - jk_shm_name(), jk_shmem.size, - jk_shmem.hdr->h.data.size - jk_shmem.hdr->h.data.pos, - jk_shmem.hdr); - } - else { - unsigned int nchild; - jk_shmem.hdr->h.data.childs++; - jk_shmem.attached = (int)getpid(); - nchild = jk_shmem.hdr->h.data.childs; - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Attached shared memory %s [%d] size=%u free=%u addr=%#lx", - jk_shm_name(), nchild, jk_shmem.size, - jk_shmem.hdr->h.data.size - jk_shmem.hdr->h.data.pos, - jk_shmem.hdr); - /* - * Reset the shared memory so that - * alloc works even for attached memory. - * XXX: This might break already used memory - * if the number of workers change between - * open and attach or between two attach operations. - */ - if (nchild > 1) { - if (JK_IS_DEBUG_LEVEL(l)) { - jk_log(l, JK_LOG_DEBUG, - "Resetting the shared memory for child %d", - nchild); - } - } - jk_shmem.hdr->h.data.pos = 0; - jk_shmem.hdr->h.data.workers = 0; - } - JK_INIT_CS(&(jk_shmem.cs), rc); - if ((rc = do_shm_open_lock(jk_shmem.filename, attached, l))) { - if (!attached) { - munmap((void *)jk_shmem.hdr, jk_shmem.size); - close(jk_shmem.fd); -#ifdef AS400_UTF8 - wptr = (char *)malloc(strlen(jk_shmem.filename) + 1); - jk_ascii2ebcdic((char *)jk_shmem.filename, wptr); - unlink(wptr); - free(wptr); -#else - unlink(jk_shmem.filename); -#endif - } - jk_shmem.hdr = NULL; - jk_shmem.fd = -1; - JK_TRACE_EXIT(l); - return rc; - } - JK_TRACE_EXIT(l); - return 0; -} - -int jk_shm_open(const char *fname, size_t sz, jk_logger_t *l) -{ - return do_shm_open(fname, 0, sz, l); -} - -int jk_shm_attach(const char *fname, size_t sz, jk_logger_t *l) -{ - return do_shm_open(fname, 1, sz, l); -} - -void jk_shm_close() -{ - int rc; -#ifdef AS400_UTF8 - char *wptr; -#endif - - if (jk_shmem.hdr) { - --jk_shmem.hdr->h.data.childs; - -#ifdef JK_SHM_LOCK_REOPEN - if (jk_shmem.fd_lock >= 0) { - close(jk_shmem.fd_lock); - jk_shmem.fd_lock = -1; - } -#endif - JK_DELETE_CS(&(jk_shmem.cs), rc); - if (jk_shmem.attached) { - int p = (int)getpid(); - if (p == jk_shmem.attached) { - /* In case this is a forked child - * do not close the shared memory. - * It will be closed by the parent. - */ - jk_shmem.size = 0; - jk_shmem.hdr = NULL; - jk_shmem.fd = -1; - return; - } - } - if (jk_shmem.fd >= 0) { - munmap((void *)jk_shmem.hdr, jk_shmem.size); - close(jk_shmem.fd); - } - if (jk_shmem.fd_lock >= 0) - close(jk_shmem.fd_lock); - if (jk_shmem.lockname) { -#ifdef AS400_UTF8 - wptr = (char *)malloc(strlen(jk_shmem.lockname) + 1); - jk_ascii2ebcdic((char *)jk_shmem.lockname, wptr); - unlink(wptr); - free(wptr); -#else - unlink(jk_shmem.lockname); -#endif - free(jk_shmem.lockname); - jk_shmem.lockname = NULL; - } - if (jk_shmem.filename) { -#ifdef AS400_UTF8 - wptr = (char *)malloc(strlen(jk_shmem.filename) + 1); - jk_ascii2ebcdic((char *)jk_shmem.filename, wptr); - unlink(wptr); - free(wptr); -#else - unlink(jk_shmem.filename); -#endif - free(jk_shmem.filename); - jk_shmem.filename = NULL; - } - } - jk_shmem.size = 0; - jk_shmem.hdr = NULL; - jk_shmem.fd = -1; - jk_shmem.fd_lock = -1; -} - - -#endif - -void *jk_shm_alloc(jk_pool_t *p, size_t size) -{ - void *rc = NULL; - - if (jk_shmem.hdr) { - size = JK_SHM_ALIGN(size); - if ((jk_shmem.hdr->h.data.size - jk_shmem.hdr->h.data.pos) >= size) { - rc = &(jk_shmem.hdr->buf[jk_shmem.hdr->h.data.pos]); - jk_shmem.hdr->h.data.pos += size; - } - } - else if (p) - rc = jk_pool_alloc(p, size); - - return rc; -} - -const char *jk_shm_name() -{ - return jk_shmem.filename; -} - - -time_t jk_shm_get_workers_time() -{ - if (jk_shmem.hdr) - return jk_shmem.hdr->h.data.modified; - else - return jk_workers_modified_time; -} - -void jk_shm_set_workers_time(time_t t) -{ - if (jk_shmem.hdr) - jk_shmem.hdr->h.data.modified = t; - else - jk_workers_modified_time = t; - jk_workers_access_time = t; -} - -int jk_shm_is_modified() -{ - time_t m = jk_shm_get_workers_time(); - if (m != jk_workers_access_time) - return 1; - else - return 0; -} - -void jk_shm_sync_access_time() -{ - jk_workers_access_time = jk_shm_get_workers_time(); -} - -int jk_shm_lock() -{ - int rc; - JK_ENTER_CS(&(jk_shmem.cs), rc); -#if defined (WIN32) - if (rc == JK_TRUE && jk_shm_hlock != NULL) { - DWORD rv = WaitForSingleObject(jk_shm_hlock, INFINITE); - if (rv == WAIT_OBJECT_0 || rv == WAIT_ABANDONED) - rc = JK_TRUE; - else - rc = JK_FALSE; - } -#else - if (rc == JK_TRUE && jk_shmem.fd_lock != -1) { - JK_ENTER_LOCK(jk_shmem.fd_lock, rc); - } -#endif - return rc; -} - -int jk_shm_unlock() -{ - int rc; - JK_LEAVE_CS(&(jk_shmem.cs), rc); -#if defined (WIN32) - if (rc == JK_TRUE && jk_shm_hlock != NULL) { - if (!ReleaseMutex(jk_shm_hlock)) - rc = JK_FALSE; - } -#else - if (rc == JK_TRUE && jk_shmem.fd_lock != -1) { - JK_LEAVE_LOCK(jk_shmem.fd_lock, rc); - } -#endif - return rc; -} - -jk_shm_ajp_worker_t *jk_shm_alloc_ajp_worker(jk_pool_t *p) -{ - jk_shm_ajp_worker_t *w = (jk_shm_ajp_worker_t *)jk_shm_alloc(p, JK_SHM_AJP_WORKER_SIZE); - if (w) { - memset(w, 0, JK_SHM_AJP_WORKER_SIZE); - if (jk_shmem.hdr) { - jk_shmem.hdr->h.data.workers++; - w->h.id = jk_shmem.hdr->h.data.workers; - w->h.type = JK_AJP13_WORKER_TYPE; - } - else - w->h.id = -1; - } - return w; -} - -jk_shm_lb_sub_worker_t *jk_shm_alloc_lb_sub_worker(jk_pool_t *p) -{ - jk_shm_lb_sub_worker_t *w = (jk_shm_lb_sub_worker_t *)jk_shm_alloc(p, JK_SHM_LB_SUB_WORKER_SIZE); - if (w) { - memset(w, 0, JK_SHM_LB_SUB_WORKER_SIZE); - if (jk_shmem.hdr) { - jk_shmem.hdr->h.data.workers++; - w->h.id = jk_shmem.hdr->h.data.workers; - w->h.type = JK_LB_SUB_WORKER_TYPE; - } - else - w->h.id = -1; - } - return w; -} - -jk_shm_lb_worker_t *jk_shm_alloc_lb_worker(jk_pool_t *p) -{ - jk_shm_lb_worker_t *w = (jk_shm_lb_worker_t *)jk_shm_alloc(p, JK_SHM_LB_WORKER_SIZE); - if (w) { - memset(w, 0, JK_SHM_LB_WORKER_SIZE); - if (jk_shmem.hdr) { - jk_shmem.hdr->h.data.workers++; - w->h.id = jk_shmem.hdr->h.data.workers; - w->h.type = JK_LB_WORKER_TYPE; - } - else - w->h.id = -1; - } - return w; -} diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.h deleted file mode 100644 index f8d54a45..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.h +++ /dev/null @@ -1,258 +0,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. - */ - -/*************************************************************************** - * Description: Shared Memory object header file * - * Author: Mladen Turk * - * Author: Rainer Jung * - * Version: $Revision: 893253 $ * - ***************************************************************************/ -#ifndef _JK_SHM_H -#define _JK_SHM_H - -#include "jk_global.h" -#include "jk_pool.h" -#include "jk_util.h" - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -/** - * @file jk_shm.h - * @brief Jk shared memory management - * - * - */ - -#define JK_SHM_MAJOR '1' -#define JK_SHM_MINOR '3' -#define JK_SHM_STR_SIZ 63 -#define JK_SHM_URI_SIZ 127 -#define JK_SHM_DYNAMIC 16 -#define JK_SHM_MAGIC '!', 'J', 'K', 'S', 'H', 'M', JK_SHM_MAJOR, JK_SHM_MINOR -#define JK_SHM_MAGIC_SIZ 8 - -/* Really huge numbers, but 64 workers should be enough */ -#define JK_SHM_MAX_WORKERS 64 -#define JK_SHM_ALIGNMENT 64 -#define JK_SHM_ALIGN(x) JK_ALIGN((x), JK_SHM_ALIGNMENT) -#define JK_SHM_AJP_WORKER_SIZE JK_SHM_ALIGN(sizeof(jk_shm_ajp_worker_t)) -#define JK_SHM_LB_SUB_WORKER_SIZE JK_SHM_ALIGN(sizeof(jk_shm_lb_sub_worker_t)) -#define JK_SHM_LB_WORKER_SIZE JK_SHM_ALIGN(sizeof(jk_shm_lb_worker_t)) -#define JK_SHM_AJP_SIZE(x) ((x) * JK_SHM_AJP_WORKER_SIZE) -#define JK_SHM_LB_SUB_SIZE(x) ((x) * JK_SHM_LB_SUB_WORKER_SIZE) -#define JK_SHM_LB_SIZE(x) ((x) * JK_SHM_LB_WORKER_SIZE) -#define JK_SHM_DEF_SIZE JK_SHM_AJP_SIZE(JK_SHM_MAX_WORKERS) + JK_SHM_LB_SUB_SIZE(JK_SHM_MAX_WORKERS) + JK_SHM_LB_SIZE(JK_SHM_MAX_WORKERS) - -/** jk shm generic worker record structure */ -struct jk_shm_worker_header -{ - int id; - int type; - /* worker name */ - char name[JK_SHM_STR_SIZ+1]; - /* Sequence counter starting at 0 and increasing - * every time we change the config - */ - volatile unsigned int sequence; -}; -typedef struct jk_shm_worker_header jk_shm_worker_header_t; - -/** jk shm ajp13/ajp14 worker record structure */ -struct jk_shm_ajp_worker -{ - jk_shm_worker_header_t h; - char host[JK_SHM_STR_SIZ+1]; - int port; - volatile int addr_sequence; - - /* Configuration data mirrored from ajp_worker */ - int cache_timeout; - int connect_timeout; - int ping_timeout; - int reply_timeout; - int prepost_timeout; - unsigned int recovery_opts; - int retries; - int retry_interval; - unsigned int max_packet_size; - /* current error state (runtime) of the worker */ - volatile int state; - /* Statistical data */ - /* Number of currently connected channels */ - volatile int connected; - /* Number of currently busy channels */ - volatile int busy; - /* Maximum number of busy channels */ - volatile int max_busy; - volatile time_t error_time; - /* Number of bytes read from remote */ - volatile jk_uint64_t readed; - /* Number of bytes transferred to remote */ - volatile jk_uint64_t transferred; - /* Number of times the worker was used */ - volatile jk_uint64_t used; - /* Number of times the worker was used - snapshot during maintenance */ - volatile jk_uint64_t used_snapshot; - /* Number of non 200 responses */ - volatile jk_uint32_t errors; - /* Decayed number of reply_timeout errors */ - volatile jk_uint32_t reply_timeouts; - /* Number of client errors */ - volatile jk_uint32_t client_errors; - /* Last reset time */ - volatile time_t last_reset; - volatile time_t last_maintain_time; -}; -typedef struct jk_shm_ajp_worker jk_shm_ajp_worker_t; - -/** jk shm lb sub worker record structure */ -struct jk_shm_lb_sub_worker -{ - jk_shm_worker_header_t h; - - /* route */ - char route[JK_SHM_STR_SIZ+1]; - /* worker domain */ - char domain[JK_SHM_STR_SIZ+1]; - /* worker redirect route */ - char redirect[JK_SHM_STR_SIZ+1]; - /* Number of currently busy channels */ - volatile int busy; - /* worker distance */ - volatile int distance; - /* current activation state (config) of the worker */ - volatile int activation; - /* current error state (runtime) of the worker */ - volatile int state; - /* Current lb factor */ - volatile int lb_factor; - /* Current lb reciprocal factor */ - volatile jk_uint64_t lb_mult; - /* Current lb value */ - volatile jk_uint64_t lb_value; - /* Statistical data */ - volatile time_t error_time; - /* Number of times the worker was elected - snapshot during maintenance */ - volatile jk_uint64_t elected_snapshot; - /* Number of non 200 responses */ - volatile jk_uint32_t errors; -}; -typedef struct jk_shm_lb_sub_worker jk_shm_lb_sub_worker_t; - -/** jk shm lb worker record structure */ -struct jk_shm_lb_worker -{ - jk_shm_worker_header_t h; - - /* Number of currently busy channels */ - volatile int busy; - /* Maximum number of busy channels */ - volatile int max_busy; - int sticky_session; - int sticky_session_force; - int recover_wait_time; - int error_escalation_time; - int max_reply_timeouts; - int retries; - int retry_interval; - int lbmethod; - int lblock; - unsigned int max_packet_size; - /* Last reset time */ - volatile time_t last_reset; - volatile time_t last_maintain_time; - /* Session cookie */ - char session_cookie[JK_SHM_STR_SIZ+1]; - /* Session path */ - char session_path[JK_SHM_STR_SIZ+1]; - -}; -typedef struct jk_shm_lb_worker jk_shm_lb_worker_t; - -const char *jk_shm_name(void); - -/* Calculate needed shm size */ -size_t jk_shm_calculate_size(jk_map_t *init_data, jk_logger_t *l); - -/* Open the shared memory creating file if needed - */ -int jk_shm_open(const char *fname, size_t sz, jk_logger_t *l); - -/* Close the shared memory - */ -void jk_shm_close(void); - -/* Attach the shared memory in child process. - * File has to be opened in parent. - */ -int jk_shm_attach(const char *fname, size_t sz, jk_logger_t *l); - -/* allocate shm memory - * If there is no shm present the pool will be used instead - */ -void *jk_shm_alloc(jk_pool_t *p, size_t size); - -/* allocate shm ajp worker record - * If there is no shm present the pool will be used instead - */ -jk_shm_ajp_worker_t *jk_shm_alloc_ajp_worker(jk_pool_t *p); - -/* allocate shm lb sub worker record - * If there is no shm present the pool will be used instead - */ -jk_shm_lb_sub_worker_t *jk_shm_alloc_lb_sub_worker(jk_pool_t *p); - -/* allocate shm lb worker record - * If there is no shm present the pool will be used instead - */ -jk_shm_lb_worker_t *jk_shm_alloc_lb_worker(jk_pool_t *p); - -/* Return workers.properties last modified time - */ -time_t jk_shm_get_workers_time(void); - -/* Set workers.properties last modified time - */ -void jk_shm_set_workers_time(time_t t); - -/* Check if the shared memory has been modified - * by some other process. - */ -int jk_shm_is_modified(void); - -/* Synchronize access and modification time. - * This function should be called when the shared memory - * is modified and after we update the config acording - * to the current shared memory data. - */ -void jk_shm_sync_access_time(void); - - -/* Lock shared memory for thread safe access */ -int jk_shm_lock(void); - -/* Unlock shared memory for thread safe access */ -int jk_shm_unlock(void); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* _JK_SHM_H */ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.lo deleted file mode 100644 index 44e59ec0..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.lo +++ /dev/null @@ -1,12 +0,0 @@ -# jk_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/jk_shm.o' - -# Name of the non-PIC object. -non_pic_object='jk_shm.o' - diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.o deleted file mode 100644 index 8f02d766..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.c deleted file mode 100644 index da956258..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.c +++ /dev/null @@ -1,195 +0,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. - */ - -/*************************************************************************** - * Description: Simple buffer object to handle buffered socket IO * - * Author: Gal Shachor * - * Version: $Revision: 466585 $ * - ***************************************************************************/ - -#include "jk_global.h" -#include "jk_sockbuf.h" - -static int fill_buffer(jk_sockbuf_t *sb); - -int jk_sb_open(jk_sockbuf_t *sb, jk_sock_t sd) -{ - if (sb && sd >= 0) { - sb->end = 0; - sb->start = 0; - sb->sd = sd; - return JK_TRUE; - } - - return JK_FALSE; -} - -int jk_sb_write(jk_sockbuf_t *sb, const void *buf, unsigned sz) -{ - if (sb && buf && sz) { - if ((SOCKBUF_SIZE - sb->end) >= sz) { - memcpy(sb->buf + sb->end, buf, sz); - sb->end += sz; - } - else { - if (!jk_sb_flush(sb)) { - return JK_FALSE; - } - if (sz > SOCKBUF_SIZE) { - return (send(sb->sd, (char *)buf, sz, 0) == (int)sz); - } - - memcpy(sb->buf + sb->end, buf, sz); - sb->end += sz; - } - - return JK_TRUE; - } - - return JK_FALSE; -} - -int jk_sb_flush(jk_sockbuf_t *sb) -{ - if (sb) { - int save_out = sb->end; - sb->end = sb->start = 0; - if (save_out) { - return send(sb->sd, sb->buf, save_out, 0) == save_out; - } - return JK_TRUE; - } - - return JK_FALSE; -} - - -int jk_sb_read(jk_sockbuf_t *sb, char **buf, unsigned sz, unsigned *ac) -{ - if (sb && buf && ac) { - unsigned avail; - - *ac = 0; - *buf = NULL; - - if (sb->end == sb->start) { - sb->end = sb->start = 0; - if (fill_buffer(sb) < 0) { - return JK_FALSE; - } - } - - *buf = sb->buf + sb->start; - avail = sb->end - sb->start; - if (avail > sz) { - *ac = sz; - } - else { - *ac = avail; - } - sb->start += *ac; - - return JK_TRUE; - } - - return JK_FALSE; -} - -int jk_sb_gets(jk_sockbuf_t *sb, char **ps) -{ - int ret; - if (sb) { - while (1) { - unsigned i; - for (i = sb->start; i < sb->end; i++) { - if (JK_LF == sb->buf[i]) { - if (i > sb->start && JK_CR == sb->buf[i - 1]) { - sb->buf[i - 1] = '\0'; - } - else { - sb->buf[i] = '\0'; - } - *ps = sb->buf + sb->start; - sb->start = (i + 1); - return JK_TRUE; - } - } - if ((ret = fill_buffer(sb)) < 0) { - return JK_FALSE; - } - else if (ret == 0) { - *ps = sb->buf + sb->start; - if ((SOCKBUF_SIZE - sb->end) > 0) { - sb->buf[sb->end] = '\0'; - } - else { - sb->buf[sb->end - 1] = '\0'; - } - return JK_TRUE; - } - } - } - - return JK_FALSE; -} - -/* - * Read data from the socket into the associated buffer, and update the - * start and end indices. May move the data currently in the buffer. If - * new data is read into the buffer (or if it is already full), returns 1. - * If EOF is received on the socket, returns 0. In case of error returns - * -1. - */ -static int fill_buffer(jk_sockbuf_t *sb) -{ - int ret; - - /* - * First move the current data to the beginning of the buffer - */ - if (sb->start < sb->end) { - if (sb->start > 0) { - unsigned to_copy = sb->end - sb->start; - memmove(sb->buf, sb->buf + sb->start, to_copy); - sb->start = 0; - sb->end = to_copy; - } - } - else { - sb->start = sb->end = 0; - } - - /* - * In the unlikely case where the buffer is already full, we won't be - * reading anything and we'd be calling recv with a 0 count. - */ - if ((SOCKBUF_SIZE - sb->end) > 0) { - /* - * Now, read more data - */ - ret = recv(sb->sd, sb->buf + sb->end, SOCKBUF_SIZE - sb->end, 0); - - /* 0 is EOF/SHUTDOWN, -1 is SOCK_ERROR */ - if (ret <= 0) { - return ret; - } - - sb->end += ret; - } - - return 1; -} diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.h deleted file mode 100644 index 4ed75141..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.h +++ /dev/null @@ -1,45 +0,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. - */ - -/*************************************************************************** - * Description: Socket buffer header file * - * Author: Gal Shachor * - * Version: $Revision: 466585 $ * - ***************************************************************************/ - -#include "jk_global.h" - -#define SOCKBUF_SIZE (8*1024) - -struct jk_sockbuf -{ - char buf[SOCKBUF_SIZE]; - unsigned int start; - unsigned int end; - jk_sock_t sd; -}; -typedef struct jk_sockbuf jk_sockbuf_t; - -int jk_sb_open(jk_sockbuf_t *sb, jk_sock_t sd); - -int jk_sb_write(jk_sockbuf_t *sb, const void *buf, unsigned sz); - -int jk_sb_read(jk_sockbuf_t *sb, char **buf, unsigned sz, unsigned *ac); - -int jk_sb_flush(jk_sockbuf_t *sb); - -int jk_sb_gets(jk_sockbuf_t *sb, char **ps); diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.lo deleted file mode 100644 index 81ac7e40..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.lo +++ /dev/null @@ -1,12 +0,0 @@ -# jk_sockbuf.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/jk_sockbuf.o' - -# Name of the non-PIC object. -non_pic_object='jk_sockbuf.o' - diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.o deleted file mode 100644 index 53350c5d..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.c deleted file mode 100644 index d9c0a6ad..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.c +++ /dev/null @@ -1,5200 +0,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. - */ - -/*************************************************************************** - * Description: Status worker, display and manages JK workers * - * Author: Mladen Turk * - * Author: Rainer Jung * - * Version: $Revision: 1054603 $ * - ***************************************************************************/ - -#include "jk_pool.h" -#include "jk_service.h" -#include "jk_util.h" -#include "jk_worker.h" -#include "jk_status.h" -#include "jk_mt.h" -#include "jk_shm.h" -#include "jk_ajp_common.h" -#include "jk_lb_worker.h" -#include "jk_ajp13_worker.h" -#include "jk_ajp14_worker.h" -#include "jk_connect.h" -#include "jk_uri_worker_map.h" - -#define HUGE_BUFFER_SIZE (8*1024) - -/** - * Command line reference: - * cmd=list (default) display configuration - * cmd=show display detailed configuration - * cmd=edit form to change configuration - * cmd=update commit update configuration - * cmd=reset reset lb runtime states, or lb member runtime states - * cmd=version show only software version - * Query arguments: - * re=n (refresh time in seconds, n=0: disabled) - * w=worker (cmd should be executed for worker "worker") - * sw=sub_worker (cmd should be executed for "sub_worker" of worker "worker") - * from=lastcmd (the last viewing command was "lastcmd") - * opt=option (changes meaning of edit and list/show) - */ - -#define JK_STATUS_ARG_CMD "cmd" -#define JK_STATUS_ARG_MIME "mime" -#define JK_STATUS_ARG_FROM "from" -#define JK_STATUS_ARG_REFRESH "re" -#define JK_STATUS_ARG_WORKER "w" -#define JK_STATUS_ARG_SUB_WORKER "sw" -#define JK_STATUS_ARG_PREV_SUB_WORKER "psw" -#define JK_STATUS_ARG_ATTRIBUTE "att" -#define JK_STATUS_ARG_MULT_VALUE_BASE "val" -#define JK_STATUS_ARG_OPTIONS "opt" - -#define JK_STATUS_ARG_OPTION_NO_MEMBERS 0x0001 -#define JK_STATUS_ARG_OPTION_NO_MAPS 0x0002 -#define JK_STATUS_ARG_OPTION_NO_LEGEND 0x0004 -#define JK_STATUS_ARG_OPTION_NO_LB 0x0008 -#define JK_STATUS_ARG_OPTION_NO_AJP 0x0010 -#define JK_STATUS_ARG_OPTION_READ_ONLY 0x0020 -#define JK_STATUS_ARG_OPTION_NO_LB_CONF 0x0040 -#define JK_STATUS_ARG_OPTION_NO_LB_SUMMARY 0x0080 -#define JK_STATUS_ARG_OPTION_NO_AJP_CONF 0x0100 - -#define JK_STATUS_ARG_LB_RETRIES ("vlr") -#define JK_STATUS_ARG_LB_RETRY_INT ("vlri") -#define JK_STATUS_ARG_LB_RECOVER_TIME ("vlt") -#define JK_STATUS_ARG_LB_ERROR_ESCALATION_TIME ("vlee") -#define JK_STATUS_ARG_LB_MAX_REPLY_TIMEOUTS ("vlx") -#define JK_STATUS_ARG_LB_STICKY ("vls") -#define JK_STATUS_ARG_LB_STICKY_FORCE ("vlf") -#define JK_STATUS_ARG_LB_METHOD ("vlm") -#define JK_STATUS_ARG_LB_LOCK ("vll") - -#define JK_STATUS_ARG_LB_TEXT_RETRIES "Retries" -#define JK_STATUS_ARG_LB_TEXT_RETRY_INT "Retry Interval" -#define JK_STATUS_ARG_LB_TEXT_RECOVER_TIME "Recover Wait Time" -#define JK_STATUS_ARG_LB_TEXT_ERROR_ESCALATION_TIME "Error Escalation Time" -#define JK_STATUS_ARG_LB_TEXT_MAX_REPLY_TIMEOUTS "Max Reply Timeouts" -#define JK_STATUS_ARG_LB_TEXT_STICKY "Sticky Sessions" -#define JK_STATUS_ARG_LB_TEXT_STICKY_FORCE "Force Sticky Sessions" -#define JK_STATUS_ARG_LB_TEXT_METHOD "LB Method" -#define JK_STATUS_ARG_LB_TEXT_LOCK "Locking" - -#define JK_STATUS_ARG_LBM_ACTIVATION ("vwa") -#define JK_STATUS_ARG_LBM_FACTOR ("vwf") -#define JK_STATUS_ARG_LBM_ROUTE ("vwn") -#define JK_STATUS_ARG_LBM_REDIRECT ("vwr") -#define JK_STATUS_ARG_LBM_DOMAIN ("vwc") -#define JK_STATUS_ARG_LBM_DISTANCE ("vwd") - -#define JK_STATUS_ARG_LBM_TEXT_ACTIVATION "Activation" -#define JK_STATUS_ARG_LBM_TEXT_FACTOR "LB Factor" -#define JK_STATUS_ARG_LBM_TEXT_ROUTE "Route" -#define JK_STATUS_ARG_LBM_TEXT_REDIRECT "Redirect Route" -#define JK_STATUS_ARG_LBM_TEXT_DOMAIN "Cluster Domain" -#define JK_STATUS_ARG_LBM_TEXT_DISTANCE "Distance" - -#define JK_STATUS_ARG_AJP_CACHE_TO "vacpt" -#define JK_STATUS_ARG_AJP_PING_TO "vapng" -#define JK_STATUS_ARG_AJP_CONNECT_TO "vact" -#define JK_STATUS_ARG_AJP_PREPOST_TO "vapt" -#define JK_STATUS_ARG_AJP_REPLY_TO "vart" -#define JK_STATUS_ARG_AJP_RETRIES "var" -#define JK_STATUS_ARG_AJP_RETRY_INT "vari" -#define JK_STATUS_ARG_AJP_REC_OPTS "varo" -#define JK_STATUS_ARG_AJP_MAX_PK_SZ "vamps" -#define JK_STATUS_ARG_AJP_CPING_INT "vacpi" -#define JK_STATUS_ARG_AJP_HOST_STR "vahst" -#define JK_STATUS_ARG_AJP_PORT "vaprt" - -#define JK_STATUS_ARG_AJP_TEXT_CACHE_TO "Connection Pool Timeout" -#define JK_STATUS_ARG_AJP_TEXT_PING_TO "Ping Timeout" -#define JK_STATUS_ARG_AJP_TEXT_CONNECT_TO "Connect Timeout" -#define JK_STATUS_ARG_AJP_TEXT_PREPOST_TO "Prepost Timeout" -#define JK_STATUS_ARG_AJP_TEXT_REPLY_TO "Reply Timeout" -#define JK_STATUS_ARG_AJP_TEXT_RETRIES "Retries" -#define JK_STATUS_ARG_AJP_TEXT_RETRY_INT "Retry Interval" -#define JK_STATUS_ARG_AJP_TEXT_REC_OPTS "Recovery Options" -#define JK_STATUS_ARG_AJP_TEXT_MAX_PK_SZ "Max Packet Size" -#define JK_STATUS_ARG_AJP_TEXT_CPING_INT "Connection Ping Interval" -#define JK_STATUS_ARG_AJP_TEXT_HOST_STR "Hostname" -#define JK_STATUS_ARG_AJP_TEXT_PORT "Port" -#define JK_STATUS_ARG_AJP_TEXT_ADDR_STR "Address:Port" - -#define JK_STATUS_CMD_UNKNOWN (0) -#define JK_STATUS_CMD_LIST (1) -#define JK_STATUS_CMD_SHOW (2) -#define JK_STATUS_CMD_EDIT (3) -#define JK_STATUS_CMD_UPDATE (4) -#define JK_STATUS_CMD_RESET (5) -#define JK_STATUS_CMD_VERSION (6) -#define JK_STATUS_CMD_RECOVER (7) -#define JK_STATUS_CMD_DUMP (8) -#define JK_STATUS_CMD_DEF (JK_STATUS_CMD_LIST) -#define JK_STATUS_CMD_MAX (JK_STATUS_CMD_DUMP) -#define JK_STATUS_CMD_TEXT_UNKNOWN ("unknown") -#define JK_STATUS_CMD_TEXT_LIST ("list") -#define JK_STATUS_CMD_TEXT_SHOW ("show") -#define JK_STATUS_CMD_TEXT_EDIT ("edit") -#define JK_STATUS_CMD_TEXT_UPDATE ("update") -#define JK_STATUS_CMD_TEXT_RESET ("reset") -#define JK_STATUS_CMD_TEXT_VERSION ("version") -#define JK_STATUS_CMD_TEXT_RECOVER ("recover") -#define JK_STATUS_CMD_TEXT_DUMP ("dump") -#define JK_STATUS_CMD_TEXT_DEF (JK_STATUS_CMD_TEXT_LIST) - -#define JK_STATUS_CMD_PROP_CHECK_WORKER 0x00000001 -#define JK_STATUS_CMD_PROP_READONLY 0x00000002 -#define JK_STATUS_CMD_PROP_HEAD 0x00000004 -#define JK_STATUS_CMD_PROP_REFRESH 0x00000008 -#define JK_STATUS_CMD_PROP_BACK_LINK 0x00000010 -#define JK_STATUS_CMD_PROP_BACK_LIST 0x00000020 -#define JK_STATUS_CMD_PROP_FMT 0x00000040 -#define JK_STATUS_CMD_PROP_SWITCH_RO 0x00000080 -#define JK_STATUS_CMD_PROP_DUMP_LINK 0x00000100 -#define JK_STATUS_CMD_PROP_LINK_HELP 0x00000200 -#define JK_STATUS_CMD_PROP_LEGEND 0x00000400 -#define JK_STATUS_CMD_PROP_WILDCARD 0x00000800 - -#define JK_STATUS_MIME_UNKNOWN (0) -#define JK_STATUS_MIME_HTML (1) -#define JK_STATUS_MIME_XML (2) -#define JK_STATUS_MIME_TXT (3) -#define JK_STATUS_MIME_PROP (4) -#define JK_STATUS_MIME_DEF (JK_STATUS_MIME_HTML) -#define JK_STATUS_MIME_MAX (JK_STATUS_MIME_PROP) -#define JK_STATUS_MIME_TEXT_UNKNOWN ("unknown") -#define JK_STATUS_MIME_TEXT_HTML ("html") -#define JK_STATUS_MIME_TEXT_XML ("xml") -#define JK_STATUS_MIME_TEXT_TXT ("txt") -#define JK_STATUS_MIME_TEXT_PROP ("prop") -#define JK_STATUS_MIME_TEXT_DEF (JK_STATUS_MIME_TEXT_HTML) - -#define JK_STATUS_MASK_ACTIVE 0x000000FF -#define JK_STATUS_MASK_DISABLED 0x0000FF00 -#define JK_STATUS_MASK_STOPPED 0x00FF0000 -#define JK_STATUS_MASK_OK 0x00010101 -#define JK_STATUS_MASK_IDLE 0x00020202 -#define JK_STATUS_MASK_BUSY 0x00040404 -#define JK_STATUS_MASK_RECOVER 0x00080808 -#define JK_STATUS_MASK_ERROR 0x00101010 -#define JK_STATUS_MASK_GOOD_DEF 0x0000000F -#define JK_STATUS_MASK_BAD_DEF 0x00FF1010 - -#define JK_STATUS_NEEDS_PUSH 0x00000001 -#define JK_STATUS_NEEDS_RESET_LB_VALUES 0x00000002 -#define JK_STATUS_NEEDS_UPDATE_MULT 0x00000004 -#define JK_STATUS_NEEDS_ADDR_PUSH 0x00000008 - -#define JK_STATUS_WAIT_AFTER_UPDATE "3" -#define JK_STATUS_REFRESH_DEF "10" -#define JK_STATUS_ESC_CHARS ("<>?\"") -#define JK_STATUS_TIME_FMT_HTML "%a, %d %b %Y %X %Z" -#define JK_STATUS_TIME_FMT_TEXT "%Y%m%d%H%M%S" -#define JK_STATUS_TIME_FMT_TZ "%Z" -#define JK_STATUS_TIME_BUF_SZ (80) - -#define JK_STATUS_HEAD "\n" \ - "\n" \ - "" \ - "JK Status Manager" - -#define JK_STATUS_COPYRIGHT "Copyright © 1999-2011, The Apache Software Foundation
" \ - "Licensed under the " \ - "Apache License, Version 2.0." - -#define JK_STATUS_HEND "\n\n" -#define JK_STATUS_BEND "\n\n" - -#define JK_STATUS_XMLH "\n" - -#define JK_STATUS_NS_DEF "jk:" -#define JK_STATUS_XMLNS_DEF "xmlns:jk=\"http://tomcat.apache.org\"" -#define JK_STATUS_PREFIX_DEF "worker" - -#define JK_STATUS_FORM_START "
\n" -#define JK_STATUS_FORM_HIDDEN_INT "\n" -#define JK_STATUS_FORM_HIDDEN_STRING "\n" -#define JK_STATUS_URI_MAP_TABLE_HEAD "%s%s%s%s%s%s%s%s%s\n" -#define JK_STATUS_URI_MAP_TABLE_ROW "%s%s%s%d%s%s%s%s%d\n" -#define JK_STATUS_URI_MAP_TABLE_HEAD2 "%s%s%s%s%s%s%s%s%s%s\n" -#define JK_STATUS_URI_MAP_TABLE_ROW2 "%s%s%s%s%d%s%s%s%s%d\n" -#define JK_STATUS_SHOW_AJP_CONF_HEAD "" \ - "Type" \ - "" JK_STATUS_ARG_AJP_TEXT_HOST_STR "" \ - "" JK_STATUS_ARG_AJP_TEXT_ADDR_STR "" \ - "" JK_STATUS_ARG_AJP_TEXT_CACHE_TO "" \ - "" JK_STATUS_ARG_AJP_TEXT_CONNECT_TO "" \ - "" JK_STATUS_ARG_AJP_TEXT_PREPOST_TO "" \ - "" JK_STATUS_ARG_AJP_TEXT_REPLY_TO "" \ - "" JK_STATUS_ARG_AJP_TEXT_RETRIES "" \ - "" JK_STATUS_ARG_AJP_TEXT_REC_OPTS "" \ - "" JK_STATUS_ARG_AJP_TEXT_MAX_PK_SZ "" \ - "\n" -#define JK_STATUS_SHOW_AJP_CONF_ROW "" \ - "%s" \ - "%s" \ - "%s" \ - "%d" \ - "%d" \ - "%d" \ - "%d" \ - "%u" \ - "%u" \ - "" \ - "\n" -#define JK_STATUS_SHOW_AJP_HEAD "" \ - "State" \ - "Acc" \ - "ErrCERE" \ - "WrRdBusyMaxConLRLE" \ - "\n" -#define JK_STATUS_SHOW_AJP_ROW "" \ - "%s" \ - "%" JK_UINT64_T_FMT " (%d/sec)" \ - "%" JK_UINT32_T_FMT "" \ - "%" JK_UINT32_T_FMT "" \ - "%" JK_UINT32_T_FMT "" \ - "%s (%s/sec)" \ - "%s (%s/sec)" \ - "%d" \ - "%d" \ - "%d" \ - "%d" \ - "%s" \ - "\n" -#define JK_STATUS_SHOW_LB_HEAD "" \ - "Type" \ - "" JK_STATUS_ARG_LB_TEXT_STICKY "" \ - "" JK_STATUS_ARG_LB_TEXT_STICKY_FORCE "" \ - "" JK_STATUS_ARG_LB_TEXT_RETRIES "" \ - "" JK_STATUS_ARG_LB_TEXT_METHOD "" \ - "" JK_STATUS_ARG_LB_TEXT_LOCK "" \ - "" JK_STATUS_ARG_LB_TEXT_RECOVER_TIME "" \ - "" JK_STATUS_ARG_LB_TEXT_ERROR_ESCALATION_TIME "" \ - "" JK_STATUS_ARG_LB_TEXT_MAX_REPLY_TIMEOUTS "" \ - "\n" -#define JK_STATUS_SHOW_LB_ROW "" \ - "%s" \ - "%s" \ - "%s" \ - "%d" \ - "%s" \ - "%s" \ - "%d" \ - "%d" \ - "%d" \ - "" \ - "\n" -#define JK_STATUS_SHOW_MEMBER_HEAD "" \ - " Name" \ - "ActState" \ - "DFM" \ - "VAcc" \ - "ErrCERE" \ - "WrRdBusyMaxCon" \ - "" JK_STATUS_ARG_LBM_TEXT_ROUTE "" \ - "RRCdRsLRLE" \ - "\n" -#define JK_STATUS_SHOW_MEMBER_ROW "%s" \ - "%s" \ - "%s" \ - "%d" \ - "%d" \ - "%" JK_UINT64_T_FMT "" \ - "%" JK_UINT64_T_FMT "" \ - "%" JK_UINT64_T_FMT " (%d/sec)" \ - "%" JK_UINT32_T_FMT "" \ - "%" JK_UINT32_T_FMT "" \ - "%" JK_UINT32_T_FMT "" \ - "%s (%s/sec)" \ - "%s (%s/sec)" \ - "%d" \ - "%d" \ - "%d" \ - "%s" \ - "%s" \ - "%s" \ - "%d/%d" \ - "%d" \ - "%s" \ - "\n" -#define JK_STATUS_SHOW_MEMBER_CONF_HEAD "" \ - "NameType" \ - "" JK_STATUS_ARG_AJP_TEXT_HOST_STR "" \ - "" JK_STATUS_ARG_AJP_TEXT_ADDR_STR "" \ - "" JK_STATUS_ARG_AJP_TEXT_CACHE_TO "" \ - "" JK_STATUS_ARG_AJP_TEXT_CONNECT_TO "" \ - "" JK_STATUS_ARG_AJP_TEXT_PREPOST_TO "" \ - "" JK_STATUS_ARG_AJP_TEXT_REPLY_TO "" \ - "" JK_STATUS_ARG_AJP_TEXT_RETRIES "" \ - "" JK_STATUS_ARG_AJP_TEXT_REC_OPTS "" \ - "" JK_STATUS_ARG_AJP_TEXT_MAX_PK_SZ "" \ - "\n" -#define JK_STATUS_SHOW_MEMBER_CONF_ROW "" \ - "%s" \ - "%s" \ - "%s" \ - "%s" \ - "%d" \ - "%d" \ - "%d" \ - "%d" \ - "%d" \ - "%u" \ - "%u" \ - "" \ - "\n" - -typedef struct status_worker status_worker_t; - -struct status_endpoint -{ - status_worker_t *worker; - - char *query_string; - jk_map_t *req_params; - char *msg; - - jk_endpoint_t endpoint; - -}; - -typedef struct status_endpoint status_endpoint_t; - -struct status_worker -{ - jk_pool_t p; - jk_pool_atom_t buf[TINY_POOL_SIZE]; - const char *name; - const char *css; - const char *ns; - const char *xmlns; - const char *doctype; - const char *prefix; - int read_only; - char **user_names; - unsigned int num_of_users; - int user_case_insensitive; - jk_uint32_t good_mask; - jk_uint32_t bad_mask; - jk_worker_t worker; - jk_worker_env_t *we; -}; - -static const char *worker_type[] = { - "unknown", - "ajp12", - "ajp13", - "ajp14", - "jni", - "lb", - "status", - NULL -}; - -static const char *headers_names[] = { - "Content-Type", - "Cache-Control", - "Pragma", - NULL -}; - -static const char *cmd_type[] = { - JK_STATUS_CMD_TEXT_UNKNOWN, - JK_STATUS_CMD_TEXT_LIST, - JK_STATUS_CMD_TEXT_SHOW, - JK_STATUS_CMD_TEXT_EDIT, - JK_STATUS_CMD_TEXT_UPDATE, - JK_STATUS_CMD_TEXT_RESET, - JK_STATUS_CMD_TEXT_VERSION, - JK_STATUS_CMD_TEXT_RECOVER, - JK_STATUS_CMD_TEXT_DUMP, - NULL -}; - -static const char *mime_type[] = { - JK_STATUS_MIME_TEXT_UNKNOWN, - JK_STATUS_MIME_TEXT_HTML, - JK_STATUS_MIME_TEXT_XML, - JK_STATUS_MIME_TEXT_TXT, - JK_STATUS_MIME_TEXT_PROP, - NULL -}; - -#define HEADERS_NO_CACHE "no-cache", "no-cache", NULL - -static const char *headers_vhtml[] = { - "text/html", - HEADERS_NO_CACHE -}; - -static const char *headers_vxml[] = { - "text/xml", - HEADERS_NO_CACHE -}; - -static const char *headers_vtxt[] = { - "text/plain", - HEADERS_NO_CACHE -}; - -static void jk_puts(jk_ws_service_t *s, const char *str) -{ - if (str) - s->write(s, str, (unsigned int)strlen(str)); - else - s->write(s, "(null)", 6); -} - -static void jk_putv(jk_ws_service_t *s, ...) -{ - va_list va; - const char *str; - - va_start(va, s); - while (1) { - str = va_arg(va, const char *); - if (str == NULL) - break; - s->write(s, str, (unsigned int)strlen(str)); - } - va_end(va); -} - -static int jk_printf(jk_ws_service_t *s, const char *fmt, ...) -{ - int rc = 0; - va_list args; -#ifdef NETWARE -/* On NetWare, this can get called on a thread that has a limited stack so */ -/* we will allocate and free the temporary buffer in this function */ - char *buf; -#else - char buf[HUGE_BUFFER_SIZE]; -#endif - - if (!s || !fmt) { - return -1; - } - va_start(args, fmt); - -#ifdef NETWARE - buf = (char *)malloc(HUGE_BUFFER_SIZE); - if (NULL == buf) - return -1; -#endif - rc = vsnprintf(buf, HUGE_BUFFER_SIZE, fmt, args); - va_end(args); - if (rc > 0) - s->write(s, buf, rc); -#ifdef NETWARE - free(buf); -#endif - return rc; -} - -static void jk_print_xml_start_elt(jk_ws_service_t *s, status_worker_t *w, - int indentation, int close_tag, - const char *name) -{ - if (close_tag) { - jk_printf(s, "%*s<%s%s>\n", indentation, "", w->ns, name); - } - else { - jk_printf(s, "%*s<%s%s\n", indentation, "", w->ns, name); - } -} - -static void jk_print_xml_close_elt(jk_ws_service_t *s, status_worker_t *w, - int indentation, - const char *name) -{ - jk_printf(s, "%*s\n", indentation, "", w->ns, name); -} - -static void jk_print_xml_stop_elt(jk_ws_service_t *s, - int indentation, int close_tag) -{ - if (close_tag) { - jk_printf(s, "%*s/>\n", indentation, ""); - } - else { - jk_printf(s, "%*s>\n", indentation, ""); - } -} - -static void jk_print_xml_att_string(jk_ws_service_t *s, - int indentation, - const char *key, const char *value) -{ - jk_printf(s, "%*s%s=\"%s\"\n", indentation, "", key, value ? value : ""); -} - -static void jk_print_xml_att_int(jk_ws_service_t *s, - int indentation, - const char *key, int value) -{ - jk_printf(s, "%*s%s=\"%d\"\n", indentation, "", key, value); -} - -static void jk_print_xml_att_uint(jk_ws_service_t *s, - int indentation, - const char *key, unsigned int value) -{ - jk_printf(s, "%*s%s=\"%u\"\n", indentation, "", key, value); -} - -static void jk_print_xml_att_long(jk_ws_service_t *s, - int indentation, - const char *key, long value) -{ - jk_printf(s, "%*s%s=\"%ld\"\n", indentation, "", key, value); -} - -static void jk_print_xml_att_uint32(jk_ws_service_t *s, - int indentation, - const char *key, jk_uint32_t value) -{ - jk_printf(s, "%*s%s=\"%" JK_UINT32_T_FMT "\"\n", indentation, "", key, value); -} - -static void jk_print_xml_att_uint64(jk_ws_service_t *s, - int indentation, - const char *key, jk_uint64_t value) -{ - jk_printf(s, "%*s%s=\"%" JK_UINT64_T_FMT "\"\n", indentation, "", key, value); -} - -static void jk_print_prop_att_string(jk_ws_service_t *s, status_worker_t *w, - const char *name, - const char *key, const char *value) -{ - if (name) { - jk_printf(s, "%s.%s.%s=%s\n", w->prefix, name, key, value ? value : ""); - } - else { - jk_printf(s, "%s.%s=%s\n", w->prefix, key, value ? value : ""); - } -} - -static void jk_print_prop_att_int(jk_ws_service_t *s, status_worker_t *w, - const char *name, - const char *key, int value) -{ - if (name) { - jk_printf(s, "%s.%s.%s=%d\n", w->prefix, name, key, value); - } - else { - jk_printf(s, "%s.%s=%d\n", w->prefix, key, value); - } -} - -static void jk_print_prop_att_uint(jk_ws_service_t *s, status_worker_t *w, - const char *name, - const char *key, unsigned int value) -{ - if (name) { - jk_printf(s, "%s.%s.%s=%u\n", w->prefix, name, key, value); - } - else { - jk_printf(s, "%s.%s=%u\n", w->prefix, key, value); - } -} - -static void jk_print_prop_att_long(jk_ws_service_t *s, status_worker_t *w, - const char *name, - const char *key, long value) -{ - if (name) { - jk_printf(s, "%s.%s.%s=%ld\n", w->prefix, name, key, value); - } - else { - jk_printf(s, "%s.%s=%ld\n", w->prefix, key, value); - } -} - -static void jk_print_prop_att_uint32(jk_ws_service_t *s, status_worker_t *w, - const char *name, - const char *key, jk_uint32_t value) -{ - if (name) { - jk_printf(s, "%s.%s.%s=%" JK_UINT32_T_FMT "\n", w->prefix, name, key, value); - } - else { - jk_printf(s, "%s.%s=%" JK_UINT32_T_FMT "\n", w->prefix, key, value); - } -} - -static void jk_print_prop_att_uint64(jk_ws_service_t *s, status_worker_t *w, - const char *name, - const char *key, jk_uint64_t value) -{ - if (name) { - jk_printf(s, "%s.%s.%s=%" JK_UINT64_T_FMT "\n", w->prefix, name, key, value); - } - else { - jk_printf(s, "%s.%s=%" JK_UINT64_T_FMT "\n", w->prefix, key, value); - } -} - -static void jk_print_prop_item_int(jk_ws_service_t *s, status_worker_t *w, - const char *name, const char *list, int num, - const char *key, int value) -{ - if (name) { - jk_printf(s, "%s.%s.%s.%d.%s=%d\n", w->prefix, name, list, num, key, value); - } - else { - jk_printf(s, "%s.%s.%d.%s=%d\n", w->prefix, list, num, key, value); - } -} - -static void jk_print_prop_item_string(jk_ws_service_t *s, status_worker_t *w, - const char *name, const char *list, int num, - const char *key, const char *value) -{ - if (name) { - jk_printf(s, "%s.%s.%s.%d.%s=%s\n", w->prefix, name, list, num, key, value ? value : ""); - } - else { - jk_printf(s, "%s.%s.%d.%s=%s\n", w->prefix, list, num, key, value ? value : ""); - } -} - -/* Actually APR's apr_strfsize */ -static char *status_strfsize(jk_uint64_t size, char *buf) -{ - const char ord[] = "KMGTPE"; - const char *o = ord; - unsigned int remain, siz; - - if (size < 973) { - if (sprintf(buf, "%d ", (int) size) < 0) - return strcpy(buf, "****"); - return buf; - } - do { - remain = (unsigned int)(size & 0x03FF); - size >>= 10; - if (size >= 973) { - ++o; - continue; - } - siz = (unsigned int)(size & 0xFFFF); - if (siz < 9 || (siz == 9 && remain < 973)) { - if ((remain = ((remain * 5) + 256) / 512) >= 10) - ++siz, remain = 0; - if (sprintf(buf, "%d.%d%c", siz, remain, *o) < 0) - return strcpy(buf, "****"); - return buf; - } - if (remain >= 512) - ++siz; - if (sprintf(buf, "%d%c", siz, *o) < 0) - return strcpy(buf, "****"); - return buf; - } while (1); -} - -static int status_strftime(time_t clock, int mime, char *buf_time, char *buf_tz, - jk_logger_t *l) -{ - size_t rc_time; -#ifdef _MT_CODE_PTHREAD - struct tm res; - struct tm *tms = localtime_r(&clock, &res); -#else - struct tm *tms = localtime(&clock); -#endif - - JK_TRACE_ENTER(l); - - if (mime == JK_STATUS_MIME_HTML) - rc_time = strftime(buf_time, JK_STATUS_TIME_BUF_SZ, JK_STATUS_TIME_FMT_HTML, tms); - else { - rc_time = strftime(buf_time, JK_STATUS_TIME_BUF_SZ, JK_STATUS_TIME_FMT_TEXT, tms); - } - strftime(buf_tz, JK_STATUS_TIME_BUF_SZ, JK_STATUS_TIME_FMT_TZ, tms); - - JK_TRACE_EXIT(l); - return (int)rc_time; - -} - -static int status_rate(lb_sub_worker_t *wr, status_worker_t *w, - jk_logger_t *l) -{ - jk_uint32_t mask = 0; - int activation = wr->activation; - int state = wr->s->state; - jk_uint32_t good = w->good_mask; - jk_uint32_t bad = w->bad_mask; - int rv = 0; - - switch (activation) - { - case JK_LB_ACTIVATION_ACTIVE: - mask = JK_STATUS_MASK_ACTIVE; - break; - case JK_LB_ACTIVATION_DISABLED: - mask = JK_STATUS_MASK_DISABLED; - break; - case JK_LB_ACTIVATION_STOPPED: - mask = JK_STATUS_MASK_STOPPED; - break; - default: - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' unknown activation type '%d'", - w->name, activation); - } - switch (state) - { - case JK_LB_STATE_IDLE: - mask &= JK_STATUS_MASK_IDLE; - break; - case JK_LB_STATE_OK: - mask &= JK_STATUS_MASK_OK; - break; - case JK_LB_STATE_RECOVER: - mask &= JK_STATUS_MASK_RECOVER; - break; - case JK_LB_STATE_FORCE: - mask &= JK_STATUS_MASK_RECOVER; - break; - case JK_LB_STATE_BUSY: - mask &= JK_STATUS_MASK_BUSY; - break; - case JK_LB_STATE_ERROR: - mask &= JK_STATUS_MASK_ERROR; - break; - case JK_LB_STATE_PROBE: - mask &= JK_STATUS_MASK_RECOVER; - break; - default: - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' unknown state type '%d'", - w->name, state); - } - if (mask&bad) - rv = -1; - else if (mask&good) - rv = 1; - else - rv = 0; - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' rating of activation '%s' and state '%s' for good '%08" JK_UINT32_T_HEX_FMT - "' and bad '%08" JK_UINT32_T_HEX_FMT "' is %d", - w->name, jk_lb_get_activation(wr, l), jk_lb_get_state(wr, l), - good, bad, rv); - return rv; -} - -static jk_uint32_t status_get_single_rating(const char rating, jk_logger_t *l) -{ - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "rating retrieval for '%c'", - rating); - switch (rating) - { - case 'A': - case 'a': - return JK_STATUS_MASK_ACTIVE; - case 'D': - case 'd': - return JK_STATUS_MASK_DISABLED; - case 'S': - case 's': - return JK_STATUS_MASK_STOPPED; - case 'O': - case 'o': - return JK_STATUS_MASK_OK; - case 'I': - case 'i': - case 'N': - case 'n': - return JK_STATUS_MASK_IDLE; - case 'B': - case 'b': - return JK_STATUS_MASK_BUSY; - case 'R': - case 'r': - return JK_STATUS_MASK_RECOVER; - case 'E': - case 'e': - return JK_STATUS_MASK_ERROR; - default: - jk_log(l, JK_LOG_WARNING, - "Unknown rating type '%c'", - rating); - return 0; - } -} - -static jk_uint32_t status_get_rating(const char *rating, - jk_logger_t *l) -{ - int off = 0; - jk_uint32_t mask = 0; - - while (rating[off] == ' ' || rating[off] == '\t' || rating[off] == '.') { - off++; - } - mask = status_get_single_rating(rating[off], l); - while (rating[off] != '\0' && rating[off] != '.') { - off++; - } - if (rating[off] == '.') { - off++; - } - if (rating[off] != '\0') { - mask &= status_get_single_rating(rating[off], l); - } - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "rating for '%s' is '%08" JK_UINT32_T_HEX_FMT "'", - rating, mask); - return mask; -} - -static const char *status_worker_type(int t) -{ - if (t < 0 || t > 6) - t = 0; - return worker_type[t]; -} - - -static int status_get_string(status_endpoint_t *p, - const char *param, - const char *def, - const char **result, - jk_logger_t *l) -{ - int rv; - - *result = jk_map_get_string(p->req_params, - param, NULL); - if (*result) { - rv = JK_TRUE; - } - else { - *result = def; - rv = JK_FALSE; - } - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "retrieved string arg '%s' as '%s'%s", - param, *result ? *result : "(null)", - rv == JK_FALSE ? " (default)" : ""); - return rv; -} - -static int status_get_int(status_endpoint_t *p, - const char *param, - int def, - jk_logger_t *l) -{ - const char *arg; - int rv = def; - - if (status_get_string(p, param, NULL, &arg, l) == JK_TRUE) { - rv = atoi(arg); - } - return rv; -} - -static int status_get_bool(status_endpoint_t *p, - const char *param, - int def, - jk_logger_t *l) -{ - const char *arg; - - if (status_get_string(p, param, NULL, &arg, l) == JK_TRUE) { - return jk_get_bool_code(arg, def); - } - return def; -} - -static const char *status_cmd_text(int cmd) -{ - return cmd_type[cmd]; -} - -static int status_cmd_int(const char *cmd) -{ - if (!cmd) - return JK_STATUS_CMD_DEF; - if (!strcmp(cmd, JK_STATUS_CMD_TEXT_LIST)) - return JK_STATUS_CMD_LIST; - else if (!strcmp(cmd, JK_STATUS_CMD_TEXT_SHOW)) - return JK_STATUS_CMD_SHOW; - else if (!strcmp(cmd, JK_STATUS_CMD_TEXT_EDIT)) - return JK_STATUS_CMD_EDIT; - else if (!strcmp(cmd, JK_STATUS_CMD_TEXT_UPDATE)) - return JK_STATUS_CMD_UPDATE; - else if (!strcmp(cmd, JK_STATUS_CMD_TEXT_RESET)) - return JK_STATUS_CMD_RESET; - else if (!strcmp(cmd, JK_STATUS_CMD_TEXT_VERSION)) - return JK_STATUS_CMD_VERSION; - else if (!strcmp(cmd, JK_STATUS_CMD_TEXT_RECOVER)) - return JK_STATUS_CMD_RECOVER; - else if (!strcmp(cmd, JK_STATUS_CMD_TEXT_DUMP)) - return JK_STATUS_CMD_DUMP; - return JK_STATUS_CMD_UNKNOWN; -} - -static const char *status_mime_text(int mime) -{ - return mime_type[mime]; -} - -static int status_mime_int(const char *mime) -{ - if (!mime) - return JK_STATUS_MIME_DEF; - if (!strcmp(mime, JK_STATUS_MIME_TEXT_HTML)) - return JK_STATUS_MIME_HTML; - else if (!strcmp(mime, JK_STATUS_MIME_TEXT_XML)) - return JK_STATUS_MIME_XML; - else if (!strcmp(mime, JK_STATUS_MIME_TEXT_TXT)) - return JK_STATUS_MIME_TXT; - else if (!strcmp(mime, JK_STATUS_MIME_TEXT_PROP)) - return JK_STATUS_MIME_PROP; - return JK_STATUS_MIME_UNKNOWN; -} - -static jk_uint32_t status_cmd_props(int cmd) -{ - jk_uint32_t props = 0; - - if (cmd == JK_STATUS_CMD_LIST || - cmd == JK_STATUS_CMD_SHOW) - props |= JK_STATUS_CMD_PROP_REFRESH | - JK_STATUS_CMD_PROP_SWITCH_RO | - JK_STATUS_CMD_PROP_LINK_HELP | - JK_STATUS_CMD_PROP_LEGEND; - if (cmd == JK_STATUS_CMD_LIST || - cmd == JK_STATUS_CMD_SHOW || - cmd == JK_STATUS_CMD_VERSION) - props |= JK_STATUS_CMD_PROP_DUMP_LINK; - if (cmd == JK_STATUS_CMD_LIST || - cmd == JK_STATUS_CMD_SHOW || - cmd == JK_STATUS_CMD_VERSION || - cmd == JK_STATUS_CMD_DUMP) - props |= JK_STATUS_CMD_PROP_HEAD | - JK_STATUS_CMD_PROP_FMT; - if (cmd == JK_STATUS_CMD_SHOW || - cmd == JK_STATUS_CMD_VERSION || - cmd == JK_STATUS_CMD_DUMP) - props |= JK_STATUS_CMD_PROP_BACK_LIST; - if (cmd == JK_STATUS_CMD_SHOW || - cmd == JK_STATUS_CMD_EDIT || - cmd == JK_STATUS_CMD_VERSION || - cmd == JK_STATUS_CMD_DUMP) - props |= JK_STATUS_CMD_PROP_BACK_LINK; - if (cmd == JK_STATUS_CMD_UPDATE) - props |= JK_STATUS_CMD_PROP_WILDCARD; - if (cmd != JK_STATUS_CMD_EDIT && - cmd != JK_STATUS_CMD_UPDATE && - cmd != JK_STATUS_CMD_RESET && - cmd != JK_STATUS_CMD_RECOVER) - props |= JK_STATUS_CMD_PROP_READONLY; - if (cmd != JK_STATUS_CMD_LIST && - cmd != JK_STATUS_CMD_VERSION && - cmd != JK_STATUS_CMD_DUMP) - props |= JK_STATUS_CMD_PROP_CHECK_WORKER; - - return props; -} - -static void status_start_form(jk_ws_service_t *s, - status_endpoint_t *p, - const char *method, - int cmd, - const char *overwrite, - jk_logger_t *l) -{ - - int i; - int sz; - jk_map_t *m = p->req_params; - - if (method) - jk_printf(s, JK_STATUS_FORM_START, method, s->req_uri); - else - return; - if (cmd != JK_STATUS_CMD_UNKNOWN) { - jk_printf(s, JK_STATUS_FORM_HIDDEN_STRING, - JK_STATUS_ARG_CMD, status_cmd_text(cmd)); - } - - sz = jk_map_size(m); - for (i = 0; i < sz; i++) { - const char *k = jk_map_name_at(m, i); - const char *v = jk_map_value_at(m, i); - if ((strcmp(k, JK_STATUS_ARG_CMD) || - cmd == JK_STATUS_CMD_UNKNOWN) && - (!overwrite || - strcmp(k, overwrite))) { - jk_printf(s, JK_STATUS_FORM_HIDDEN_STRING, k, v); - } - } -} - -static void status_write_uri(jk_ws_service_t *s, - status_endpoint_t *p, - const char *text, - int cmd, int mime, - const char *worker, const char *sub_worker, - unsigned int add_options, unsigned int rm_options, - const char *attribute, - jk_logger_t *l) -{ - int i; - int sz; - int started = 0; - int from; - int restore_sub_worker = JK_FALSE; - int save_sub_worker = JK_FALSE; - int prev; - unsigned int opt = 0; - const char *arg; - jk_map_t *m = p->req_params; - - if (text) - jk_puts(s, "req_uri); - status_get_string(p, JK_STATUS_ARG_FROM, NULL, &arg, l); - from = status_cmd_int(arg); - status_get_string(p, JK_STATUS_ARG_CMD, NULL, &arg, l); - prev = status_cmd_int(arg); - if (cmd == JK_STATUS_CMD_SHOW && prev == JK_STATUS_CMD_EDIT) { - restore_sub_worker = JK_TRUE; - } - if (cmd == JK_STATUS_CMD_UNKNOWN) { - if (prev == JK_STATUS_CMD_UPDATE || - prev == JK_STATUS_CMD_RESET || - prev == JK_STATUS_CMD_RECOVER) { - cmd = from; - restore_sub_worker = JK_TRUE; - } - } - if (cmd != JK_STATUS_CMD_UNKNOWN) { - jk_printf(s, "%s%s=%s", started ? "&" : "?", - JK_STATUS_ARG_CMD, status_cmd_text(cmd)); - if (cmd == JK_STATUS_CMD_EDIT || - cmd == JK_STATUS_CMD_RESET || - cmd == JK_STATUS_CMD_RECOVER) { - jk_printf(s, "%s%s=%s", "&", - JK_STATUS_ARG_FROM, status_cmd_text(prev)); - save_sub_worker = JK_TRUE; - } - started=1; - } - if (mime != JK_STATUS_MIME_UNKNOWN) { - jk_printf(s, "%s%s=%s", started ? "&" : "?", - JK_STATUS_ARG_MIME, status_mime_text(mime)); - started=1; - } - if (worker && worker[0]) { - jk_printf(s, "%s%s=%s", started ? "&" : "?", - JK_STATUS_ARG_WORKER, worker); - started=1; - } - if (sub_worker && sub_worker[0] && cmd != JK_STATUS_CMD_LIST) { - jk_printf(s, "%s%s=%s", started ? "&" : "?", - JK_STATUS_ARG_SUB_WORKER, sub_worker); - started=1; - } - if (attribute && attribute[0]) { - jk_printf(s, "%s%s=%s", started ? "&" : "?", - JK_STATUS_ARG_ATTRIBUTE, attribute); - started=1; - } - - sz = jk_map_size(m); - for (i = 0; i < sz; i++) { - const char *k = jk_map_name_at(m, i); - const char *v = jk_map_value_at(m, i); - if (!strcmp(k, JK_STATUS_ARG_CMD) && cmd != JK_STATUS_CMD_UNKNOWN) { - continue; - } - if (!strcmp(k, JK_STATUS_ARG_MIME) && mime != JK_STATUS_MIME_UNKNOWN) { - continue; - } - if (!strcmp(k, JK_STATUS_ARG_FROM)) { - continue; - } - if (!strcmp(k, JK_STATUS_ARG_WORKER) && worker) { - continue; - } - if (!strcmp(k, JK_STATUS_ARG_SUB_WORKER)) { - if (save_sub_worker == JK_TRUE) { - jk_printf(s, "%s%s=%s", started ? "&" : "?", - JK_STATUS_ARG_PREV_SUB_WORKER, v); - started=1; - continue; - } - else if (sub_worker || cmd == JK_STATUS_CMD_LIST) { - continue; - } - else if (restore_sub_worker == JK_TRUE) { - continue; - } - } - if (!strcmp(k, JK_STATUS_ARG_PREV_SUB_WORKER) && restore_sub_worker == JK_TRUE && cmd != JK_STATUS_CMD_LIST) { - jk_printf(s, "%s%s=%s", started ? "&" : "?", - JK_STATUS_ARG_SUB_WORKER, v); - started=1; - continue; - } - if (!strcmp(k, JK_STATUS_ARG_ATTRIBUTE) && attribute) { - continue; - } - if (!strcmp(k, JK_STATUS_ARG_ATTRIBUTE) && cmd != JK_STATUS_CMD_UPDATE && cmd != JK_STATUS_CMD_EDIT) { - continue; - } - if (!strncmp(k, JK_STATUS_ARG_MULT_VALUE_BASE, 3) && cmd != JK_STATUS_CMD_UPDATE) { - continue; - } - if (k[0] == 'v' && cmd != JK_STATUS_CMD_UPDATE) { - continue; - } - if (!strcmp(k, JK_STATUS_ARG_OPTIONS)) { - opt = atoi(v); - continue; - } - jk_printf(s, "%s%s=%s", started ? "&" : "?", k, v); - started=1; - } - if (opt | add_options | rm_options) - jk_printf(s, "%s%s=%u", started ? "&" : "?", - JK_STATUS_ARG_OPTIONS, (opt | add_options) & ~rm_options); - if (text) - jk_putv(s, "\">", text, "", NULL); -} - -static int status_parse_uri(jk_ws_service_t *s, - status_endpoint_t *p, - jk_logger_t *l) -{ - jk_map_t *m; - status_worker_t *w = p->worker; -#ifdef _MT_CODE_PTHREAD - char *lasts; -#endif - char *param; - char *query; - - JK_TRACE_ENTER(l); - - if (!s->query_string) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' query string is empty", - w->name); - JK_TRACE_EXIT(l); - return JK_TRUE; - } - - p->query_string = jk_pool_strdup(s->pool, s->query_string); - if (!p->query_string) { - jk_log(l, JK_LOG_ERROR, - "Status worker '%s' could not copy query string", - w->name); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - /* XXX We simply mask special chars n the query string with '@' to prevent cross site scripting */ - query = p->query_string; - while ((query = strpbrk(query, JK_STATUS_ESC_CHARS))) - query[0] = '@'; - - if (!jk_map_alloc(&(p->req_params))) { - jk_log(l, JK_LOG_ERROR, - "Status worker '%s' could not alloc map for request parameters", - w->name); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - m = p->req_params; - - query = jk_pool_strdup(s->pool, p->query_string); - if (!query) { - jk_log(l, JK_LOG_ERROR, - "Status worker '%s' could not copy query string", - w->name); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - -#ifdef _MT_CODE_PTHREAD - for (param = strtok_r(query, "&", &lasts); - param; param = strtok_r(NULL, "&", &lasts)) { -#else - for (param = strtok(query, "&"); param; param = strtok(NULL, "&")) { -#endif - char *key = jk_pool_strdup(s->pool, param); - char *value; - if (!key) { - jk_log(l, JK_LOG_ERROR, - "Status worker '%s' could not copy string", - w->name); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - value = strchr(key, '='); - if (value) { - *value = '\0'; - value++; - /* XXX Depending on the params values, we might need to trim and decode */ - if (strlen(key)) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' adding request param '%s' with value '%s'", - w->name, key, value); - jk_map_put(m, key, value, NULL); - } - } - } - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -static void write_html_refresh_response(jk_ws_service_t *s, - status_endpoint_t *p, - const char *err, - jk_logger_t *l) -{ - if (!err) { - jk_puts(s, "\n"); - jk_putv(s, "

Result: OK - You will be redirected in " - JK_STATUS_WAIT_AFTER_UPDATE " seconds.

", NULL); - } -} - -static int fetch_worker_and_sub_worker(status_endpoint_t *p, - const char *operation, - const char **worker, - const char **sub_worker, - jk_logger_t *l) -{ - status_worker_t *w = p->worker; - - JK_TRACE_ENTER(l); - status_get_string(p, JK_STATUS_ARG_WORKER, NULL, worker, l); - status_get_string(p, JK_STATUS_ARG_SUB_WORKER, NULL, sub_worker, l); - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' %s worker '%s' sub worker '%s'", - w->name, operation, - *worker ? *worker : "(null)", *sub_worker ? *sub_worker : "(null)"); - if (!*worker || !(*worker)[0]) { - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' NULL or EMPTY worker param", - w->name); - p->msg = "NULL or EMPTY worker param"; - JK_TRACE_EXIT(l); - return JK_FALSE; - } - if (*sub_worker && !(*sub_worker)[0]) { - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' EMPTY sub worker param", - w->name); - p->msg = "EMPTY sub worker param"; - JK_TRACE_EXIT(l); - return JK_FALSE; - } - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -static int check_valid_lb(jk_ws_service_t *s, - status_endpoint_t *p, - jk_worker_t *jw, - const char *worker, - lb_worker_t **lbp, - int implemented, - jk_logger_t *l) -{ - status_worker_t *w = p->worker; - - JK_TRACE_ENTER(l); - if (jw->type != JK_LB_WORKER_TYPE) { - if (implemented) { - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' worker type of worker '%s' has no sub workers", - w->name, worker); - p->msg = "worker type has no sub workers"; - } - else { - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' worker type of worker '%s' not implemented", - w->name, worker); - p->msg = "worker type not implemented"; - } - JK_TRACE_EXIT(l); - return JK_FALSE; - } - *lbp = (lb_worker_t *)jw->worker_private; - if (!*lbp) { - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' lb structure of worker '%s' is (null)", - w->name, worker); - p->msg = "lb structure is (null)"; - JK_TRACE_EXIT(l); - return JK_FALSE; - } - p->msg = "OK"; - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -static int search_worker(jk_ws_service_t *s, - status_endpoint_t *p, - jk_worker_t **jwp, - const char *worker, - jk_logger_t *l) -{ - status_worker_t *w = p->worker; - - JK_TRACE_ENTER(l); - *jwp = NULL; - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' searching worker '%s'", - w->name, worker ? worker : "(null)"); - if (!worker || !worker[0]) { - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' NULL or EMPTY worker param", - w->name); - p->msg = "NULL or EMPTY worker param"; - JK_TRACE_EXIT(l); - return JK_FALSE; - } - *jwp = wc_get_worker_for_name(worker, l); - if (!*jwp) { - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' could not find worker '%s'", - w->name, worker); - p->msg = "Could not find given worker"; - JK_TRACE_EXIT(l); - return JK_FALSE; - } - p->msg = "OK"; - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -static int search_sub_worker(jk_ws_service_t *s, - status_endpoint_t *p, - jk_worker_t *jw, - const char *worker, - lb_sub_worker_t **wrp, - const char *sub_worker, - unsigned int *idx, - jk_logger_t *l) -{ - lb_worker_t *lb = NULL; - lb_sub_worker_t *wr = NULL; - status_worker_t *w = p->worker; - unsigned int i = 0; - - JK_TRACE_ENTER(l); - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' searching sub worker '%s' of worker '%s'", - w->name, sub_worker ? sub_worker : "(null)", - worker ? worker : "(null)"); - if (!sub_worker || !sub_worker[0]) { - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' NULL or EMPTY sub_worker param", - w->name); - p->msg = "NULL or EMPTY sub_worker param"; - JK_TRACE_EXIT(l); - return JK_FALSE; - } - if (check_valid_lb(s, p, jw, worker, &lb, 1, l) == JK_FALSE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - if (idx) - i = *idx; - for (; i < lb->num_of_workers; i++) { - wr = &(lb->lb_workers[i]); - if (idx) { - if (jk_wildchar_match(wr->name, sub_worker, 0) == 0) { - *idx = i + 1; - break; - } - } - else if (strcmp(sub_worker, wr->name) == 0) - break; - } - *wrp = wr; - if (!wr || i == lb->num_of_workers) { - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' could not find sub worker '%s' of worker '%s'", - w->name, sub_worker, worker ? worker : "(null)"); - p->msg = "could not find sub worker"; - JK_TRACE_EXIT(l); - return JK_FALSE; - } - p->msg = "OK"; - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -static int count_map(jk_uri_worker_map_t *uw_map, - const char *worker, - jk_logger_t *l) -{ - unsigned int i; - int count=0; - - JK_TRACE_ENTER(l); - if (uw_map) { - for (i = 0; i < uw_map->size[uw_map->index]; i++) { - uri_worker_record_t *uwr = uw_map->maps[uw_map->index][i]; - if (strcmp(uwr->worker_name, worker) && - strcmp(uwr->worker_name, "*")) { - continue; - } - count++; - } - } - JK_TRACE_EXIT(l); - return count; -} - -static int count_maps(jk_ws_service_t *s, - const char *worker, - jk_logger_t *l) -{ - int count=0; - - JK_TRACE_ENTER(l); - if (s->next_vhost) { - void *srv; - for (srv = s->next_vhost(NULL); srv; srv = s->next_vhost(srv)) { - count += count_map(s->vhost_to_uw_map(srv), worker, l); - } - } - else if (s->uw_map) - count = count_map(s->uw_map, worker, l); - JK_TRACE_EXIT(l); - return count; -} - -static void display_map(jk_ws_service_t *s, - status_endpoint_t *p, - jk_uri_worker_map_t *uw_map, - const char *worker, - const char *server_name, - int *count_ptr, - int mime, - jk_logger_t *l) -{ - char buf[64]; - unsigned int i; - int count; - status_worker_t *w = p->worker; - - JK_TRACE_ENTER(l); - - if (uw_map->fname) { - uri_worker_map_update(uw_map, 1, l); - } - for (i = 0; i < uw_map->size[uw_map->index]; i++) { - uri_worker_record_t *uwr = uw_map->maps[uw_map->index][i]; - - if (strcmp(uwr->worker_name, worker) && - strcmp(uwr->worker_name, "*")) { - continue; - } - (*count_ptr)++; - count = *count_ptr; - - if (mime == JK_STATUS_MIME_HTML) { - if (server_name) - jk_printf(s, JK_STATUS_URI_MAP_TABLE_ROW2, - server_name, - uwr->uri, - uri_worker_map_get_match(uwr, buf, l), - uri_worker_map_get_source(uwr, l), - uwr->extensions.reply_timeout, - uwr->extensions.fail_on_status_str ? uwr->extensions.fail_on_status_str : "-", - uwr->extensions.active ? uwr->extensions.active : "-", - uwr->extensions.disabled ? uwr->extensions.disabled : "-", - uwr->extensions.stopped ? uwr->extensions.stopped : "-", - uwr->extensions.use_server_error_pages); - else - jk_printf(s, JK_STATUS_URI_MAP_TABLE_ROW, - uwr->uri, - uri_worker_map_get_match(uwr, buf, l), - uri_worker_map_get_source(uwr, l), - uwr->extensions.reply_timeout, - uwr->extensions.fail_on_status_str ? uwr->extensions.fail_on_status_str : "-", - uwr->extensions.active ? uwr->extensions.active : "-", - uwr->extensions.disabled ? uwr->extensions.disabled : "-", - uwr->extensions.stopped ? uwr->extensions.stopped : "-", - uwr->extensions.use_server_error_pages); - } - else if (mime == JK_STATUS_MIME_XML) { - jk_print_xml_start_elt(s, w, 6, 0, "map"); - jk_print_xml_att_int(s, 8, "id", count); - if (server_name) - jk_print_xml_att_string(s, 8, "server", server_name); - jk_print_xml_att_string(s, 8, "uri", uwr->uri); - jk_print_xml_att_string(s, 8, "type", uri_worker_map_get_match(uwr, buf, l)); - jk_print_xml_att_string(s, 8, "source", uri_worker_map_get_source(uwr, l)); - jk_print_xml_att_int(s, 8, "reply_timeout", uwr->extensions.reply_timeout); - jk_print_xml_att_string(s, 8, "fail_on_status", uwr->extensions.fail_on_status_str); - jk_print_xml_att_string(s, 8, "active", uwr->extensions.active); - jk_print_xml_att_string(s, 8, "disabled", uwr->extensions.disabled); - jk_print_xml_att_string(s, 8, "stopped", uwr->extensions.stopped); - jk_print_xml_att_int(s, 8, "use_server_errors", uwr->extensions.use_server_error_pages); - jk_print_xml_stop_elt(s, 6, 1); - } - else if (mime == JK_STATUS_MIME_TXT) { - jk_puts(s, "Map:"); - jk_printf(s, " id=%d", count); - if (server_name) - jk_printf(s, " server=\"%s\"", server_name); - jk_printf(s, " uri=\"%s\"", uwr->uri); - jk_printf(s, " type=\"%s\"", uri_worker_map_get_match(uwr, buf, l)); - jk_printf(s, " source=\"%s\"", uri_worker_map_get_source(uwr, l)); - jk_printf(s, " reply_timeout=\"%d\"", uwr->extensions.reply_timeout); - jk_printf(s, " fail_on_status=\"%s\"", uwr->extensions.fail_on_status_str ? uwr->extensions.fail_on_status_str : ""); - jk_printf(s, " active=\"%s\"", uwr->extensions.active ? uwr->extensions.active : ""); - jk_printf(s, " disabled=\"%s\"", uwr->extensions.disabled ? uwr->extensions.disabled : ""); - jk_printf(s, " stopped=\"%s\"", uwr->extensions.stopped ? uwr->extensions.stopped : ""); - jk_printf(s, " use_server_errors=\"%d\"", uwr->extensions.use_server_error_pages); - jk_puts(s, "\n"); - } - else if (mime == JK_STATUS_MIME_PROP) { - if (server_name) - jk_print_prop_item_string(s, w, worker, "map", count, "server", server_name); - jk_print_prop_item_string(s, w, worker, "map", count, "uri", uwr->uri); - jk_print_prop_item_string(s, w, worker, "map", count, "type", uri_worker_map_get_match(uwr, buf, l)); - jk_print_prop_item_string(s, w, worker, "map", count, "source", uri_worker_map_get_source(uwr, l)); - jk_print_prop_item_int(s, w, worker, "map", count, "reply_timeout", uwr->extensions.reply_timeout); - jk_print_prop_item_string(s, w, worker, "map", count, "fail_on_status", uwr->extensions.fail_on_status_str); - jk_print_prop_item_string(s, w, worker, "map", count, "active", uwr->extensions.active); - jk_print_prop_item_string(s, w, worker, "map", count, "disabled", uwr->extensions.disabled); - jk_print_prop_item_string(s, w, worker, "map", count, "stopped", uwr->extensions.stopped); - jk_print_prop_item_int(s, w, worker, "map", count, "use_server_errors", uwr->extensions.use_server_error_pages); - } - } - JK_TRACE_EXIT(l); -} - -static void display_maps(jk_ws_service_t *s, - status_endpoint_t *p, - const char *worker, - jk_logger_t *l) -{ - int mime; - unsigned int hide; - int has_server_iterator = 0; - int count=0; - const char *arg; - status_worker_t *w = p->worker; - jk_uri_worker_map_t *uw_map; - char server_name[80]; - void *srv; - - JK_TRACE_ENTER(l); - status_get_string(p, JK_STATUS_ARG_MIME, NULL, &arg, l); - mime = status_mime_int(arg); - hide = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) & - JK_STATUS_ARG_OPTION_NO_MAPS; - if (s->next_vhost) - has_server_iterator = 1; - - count = count_maps(s, worker, l); - - if (hide) { - if (count && mime == JK_STATUS_MIME_HTML) { - jk_puts(s, "

\n"); - status_write_uri(s, p, "Show URI Mappings", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_MAPS, NULL, l); - jk_puts(s, "

\n"); - } - JK_TRACE_EXIT(l); - return; - } - - if (count) { - if (mime == JK_STATUS_MIME_HTML) { - jk_printf(s, "

URI Mappings for %s (%d maps) [", worker, count); - status_write_uri(s, p, "Hide", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, JK_STATUS_ARG_OPTION_NO_MAPS, 0, NULL, l); - jk_puts(s, "]

\n"); - if (has_server_iterator) - jk_printf(s, JK_STATUS_URI_MAP_TABLE_HEAD2, - "Server", "URI", "Match Type", "Source", "Reply Timeout", "Fail on Status", "Active", "Disabled", "Stopped", "Use Server Errors"); - else - jk_printf(s, JK_STATUS_URI_MAP_TABLE_HEAD, - "URI", "Match Type", "Source", "Reply Timeout", "Fail on Status", "Active", "Disabled", "Stopped", "Use Server Errors"); - } - count = 0; - if (has_server_iterator) { - for (srv = s->next_vhost(NULL); srv; srv = s->next_vhost(srv)) { - uw_map = s->vhost_to_uw_map(srv); - if (uw_map) { - s->vhost_to_text(srv, server_name, 80); - display_map(s, p, uw_map, worker, server_name, &count, mime, l); - } - } - } - else { - uw_map = s->uw_map; - if (uw_map) { - display_map(s, p, uw_map, worker, NULL, &count, mime, l); - } - } - if (mime == JK_STATUS_MIME_HTML) { - jk_puts(s, "
\n"); - } - } - else { - if (mime == JK_STATUS_MIME_HTML) { - jk_putv(s, "

Warning: No URI Mappings defined for ", - worker, " !

\n", NULL); - } - } - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' displayed %d maps for worker '%s'", - w->name, count, worker); - JK_TRACE_EXIT(l); -} - -static const char *dump_ajp_addr(ajp_worker_t *aw, char *buf) -{ - if (aw->port > 0) - return jk_dump_hinfo(&aw->worker_inet_addr, buf); - else { - if (aw->addr_sequence != aw->s->addr_sequence) - return "unresolved"; - else - return "invalid"; - } -} - -static void display_worker_ajp_conf_details(jk_ws_service_t *s, - status_endpoint_t *p, - ajp_worker_t *aw, - int is_member, - int type, - jk_logger_t *l) -{ - char buf[32]; - - JK_TRACE_ENTER(l); - - if (is_member) - jk_printf(s, JK_STATUS_SHOW_MEMBER_CONF_ROW, - aw->name, - status_worker_type(type), - aw->host, - dump_ajp_addr(aw, buf), - aw->cache_timeout, - aw->connect_timeout, - aw->prepost_timeout, - aw->reply_timeout, - aw->retries, - aw->recovery_opts, - aw->max_packet_size); - else - jk_printf(s, JK_STATUS_SHOW_AJP_CONF_ROW, - status_worker_type(type), - aw->host, - dump_ajp_addr(aw, buf), - aw->cache_timeout, - aw->connect_timeout, - aw->prepost_timeout, - aw->reply_timeout, - aw->retries, - aw->recovery_opts, - aw->max_packet_size); - JK_TRACE_EXIT(l); - -} - -static void display_worker_ajp_details(jk_ws_service_t *s, - status_endpoint_t *p, - ajp_worker_t *aw, - lb_sub_worker_t *wr, - lb_worker_t *lb, - int ms_min, - int ms_max, - int map_count, - jk_logger_t *l) -{ - char buf[32]; - char buf_rd[32]; - char buf_rd_sec[32]; - char buf_wr[32]; - char buf_wr_sec[32]; - int mime; - const char *arg; - time_t now = time(NULL); - const char *name = NULL; - const char *sub_name = NULL; - const char *ajp_name = NULL; - status_worker_t *w = p->worker; - int rs_min = 0; - int rs_max = 0; - int delta_reset = (int)difftime(now, aw->s->last_reset); - int delta_error = -1; - char buf_time[JK_STATUS_TIME_BUF_SZ]; - char buf_tz[JK_STATUS_TIME_BUF_SZ]; - time_t error_time = 0; - int rc_time = -1; - - JK_TRACE_ENTER(l); - - status_get_string(p, JK_STATUS_ARG_MIME, NULL, &arg, l); - mime = status_mime_int(arg); - - if (lb) { - name = lb->name; - sub_name = wr->name; - ajp_name = wr->name; - error_time = wr->s->error_time; - if (wr->s->state == JK_LB_STATE_ERROR) { - rs_min = lb->recover_wait_time - (int)difftime(now, wr->s->error_time); - if (rs_min < 0) { - rs_min = 0; - } - rs_max = rs_min + lb->maintain_time; - if (rs_min < ms_min) { - rs_min = ms_min; - } - } - } - else { - name = aw->name; - sub_name = NULL; - ajp_name = aw->name; - error_time = aw->s->error_time; - } - - if (error_time > 0) { - delta_error = (int)difftime(now, error_time); - rc_time = status_strftime(error_time, mime, buf_time, buf_tz, l); - } - - if (mime == JK_STATUS_MIME_HTML) { - - if (lb) - jk_printf(s, JK_STATUS_SHOW_MEMBER_ROW, - sub_name, - jk_lb_get_activation(wr, l), - jk_lb_get_state(wr, l), - wr->distance, - wr->lb_factor, - wr->lb_mult, - wr->s->lb_value, - aw->s->used, - delta_reset > 0 ? (int)(aw->s->used / delta_reset) : -1, - wr->s->errors, - aw->s->client_errors, - aw->s->reply_timeouts, - status_strfsize(aw->s->transferred, buf_wr), - delta_reset > 0 ? status_strfsize(aw->s->transferred / delta_reset, buf_wr_sec) : "-", - status_strfsize(aw->s->readed, buf_rd), - delta_reset > 0 ? status_strfsize(aw->s->readed / delta_reset , buf_rd_sec) : "-", - aw->s->busy, - aw->s->max_busy, - aw->s->connected, - wr->route, - wr->redirect ? (*wr->redirect ? wr->redirect : " ") : " ", - wr->domain ? (*wr->domain ? wr->domain : " ") : " ", - rs_min, - rs_max, - delta_reset, - rc_time > 0 ? buf_time : " "); - else { - jk_printf(s, JK_STATUS_SHOW_AJP_ROW, - jk_ajp_get_state(aw, l), - aw->s->used, - delta_reset > 0 ? (int)(aw->s->used / delta_reset) : -1, - aw->s->errors, - aw->s->client_errors, - aw->s->reply_timeouts, - status_strfsize(aw->s->transferred, buf_wr), - delta_reset > 0 ? status_strfsize(aw->s->transferred / delta_reset, buf_wr_sec) : "-", - status_strfsize(aw->s->readed, buf_rd), - delta_reset > 0 ? status_strfsize(aw->s->readed / delta_reset , buf_rd_sec) : "-", - aw->s->busy, - aw->s->max_busy, - aw->s->connected, - delta_reset, - rc_time > 0 ? buf_time : " "); - } - - } - else if (mime == JK_STATUS_MIME_XML) { - - int off = 2; - if (lb) - off = 6; - if (lb) { - jk_print_xml_start_elt(s, w, off, 0, "member"); - jk_print_xml_att_string(s, off+2, "name", sub_name); - jk_print_xml_att_string(s, off+2, "type", status_worker_type(wr->worker->type)); - } - else { - jk_print_xml_start_elt(s, w, off, 0, "ajp"); - jk_print_xml_att_string(s, off+2, "name", ajp_name); - jk_print_xml_att_string(s, off+2, "type", status_worker_type(aw->worker.type)); - } - jk_print_xml_att_string(s, off+2, "host", aw->host); - jk_print_xml_att_int(s, off+2, "port", aw->port); - jk_print_xml_att_string(s, off+2, "address", dump_ajp_addr(aw, buf)); - jk_print_xml_att_int(s, off+2, "connection_pool_timeout", aw->cache_timeout); - jk_print_xml_att_int(s, off+2, "ping_timeout", aw->ping_timeout); - jk_print_xml_att_int(s, off+2, "connect_timeout", aw->connect_timeout); - jk_print_xml_att_int(s, off+2, "prepost_timeout", aw->prepost_timeout); - jk_print_xml_att_int(s, off+2, "reply_timeout", aw->reply_timeout); - jk_print_xml_att_int(s, off+2, "connection_ping_interval", aw->conn_ping_interval); - jk_print_xml_att_int(s, off+2, "retries", aw->retries); - jk_print_xml_att_uint(s, off+2, "recovery_options", aw->recovery_opts); - jk_print_xml_att_uint(s, off+2, "max_packet_size", aw->max_packet_size); - if (lb) { - jk_print_xml_att_string(s, off+2, "activation", jk_lb_get_activation(wr, l)); - jk_print_xml_att_int(s, off+2, "lbfactor", wr->lb_factor); - jk_print_xml_att_string(s, off+2, "route", wr->route); - jk_print_xml_att_string(s, off+2, "redirect", wr->redirect); - jk_print_xml_att_string(s, off+2, "domain", wr->domain); - jk_print_xml_att_int(s, off+2, "distance", wr->distance); - jk_print_xml_att_string(s, off+2, "state", jk_lb_get_state(wr, l)); - jk_print_xml_att_uint64(s, off+2, "lbmult", wr->lb_mult); - jk_print_xml_att_uint64(s, off+2, "lbvalue", wr->s->lb_value); - jk_print_xml_att_uint64(s, off+2, "elected", aw->s->used); - jk_print_xml_att_uint32(s, off+2, "errors", wr->s->errors); - } - else { - jk_print_xml_att_uint64(s, off+2, "used", aw->s->used); - jk_print_xml_att_uint32(s, off+2, "errors", aw->s->errors); - } - jk_print_xml_att_uint32(s, off+2, "client_errors", aw->s->client_errors); - jk_print_xml_att_uint32(s, off+2, "reply_timeouts", aw->s->reply_timeouts); - jk_print_xml_att_uint64(s, off+2, "transferred", aw->s->transferred); - jk_print_xml_att_uint64(s, off+2, "read", aw->s->readed); - jk_print_xml_att_int(s, off+2, "busy", aw->s->busy); - jk_print_xml_att_int(s, off+2, "max_busy", aw->s->max_busy); - jk_print_xml_att_int(s, off+2, "connected", aw->s->connected); - if (lb) { - jk_print_xml_att_int(s, off+2, "time_to_recover_min", rs_min); - jk_print_xml_att_int(s, off+2, "time_to_recover_max", rs_max); - } - else - jk_print_xml_att_int(s, off+2, "map_count", map_count); - jk_print_xml_att_long(s, off+2, "last_reset_at", (long)aw->s->last_reset); - jk_print_xml_att_int(s, off+2, "last_reset_ago", delta_reset); - if (rc_time > 0 ) { - jk_print_xml_att_string(s, off+2, "error_time_datetime", buf_time); - jk_print_xml_att_string(s, off+2, "error_time_tz", buf_tz); - jk_print_xml_att_int(s, off+2, "error_time_unix_seconds", (int)error_time); - jk_print_xml_att_int(s, off+2, "error_time_ago", delta_error); - } - /* Terminate the tag */ - jk_print_xml_stop_elt(s, off, 1); - - } - else if (mime == JK_STATUS_MIME_TXT) { - - if (lb) { - jk_puts(s, "Member:"); - jk_printf(s, " name=%s", sub_name); - jk_printf(s, " type=%s", status_worker_type(wr->worker->type)); - } - else { - jk_puts(s, "AJP Worker:"); - jk_printf(s, " name=%s", ajp_name); - jk_printf(s, " type=%s", status_worker_type(aw->worker.type)); - } - jk_printf(s, " host=%s", aw->host); - jk_printf(s, " port=%d", aw->port); - jk_printf(s, " address=%s", dump_ajp_addr(aw, buf)); - jk_printf(s, " connection_pool_timeout=%d", aw->cache_timeout); - jk_printf(s, " ping_timeout=%d", aw->ping_timeout); - jk_printf(s, " connect_timeout=%d", aw->connect_timeout); - jk_printf(s, " prepost_timeout=%d", aw->prepost_timeout); - jk_printf(s, " reply_timeout=%d", aw->reply_timeout); - jk_printf(s, " retries=%d", aw->retries); - jk_printf(s, " connection_ping_interval=%d", aw->conn_ping_interval); - jk_printf(s, " recovery_options=%u", aw->recovery_opts); - jk_printf(s, " max_packet_size=%u", aw->max_packet_size); - if (lb) { - jk_printf(s, " activation=%s", jk_lb_get_activation(wr, l)); - jk_printf(s, " lbfactor=%d", wr->lb_factor); - jk_printf(s, " route=\"%s\"", wr->route ? wr->route : ""); - jk_printf(s, " redirect=\"%s\"", wr->redirect ? wr->redirect : ""); - jk_printf(s, " domain=\"%s\"", wr->domain ? wr->domain : ""); - jk_printf(s, " distance=%d", wr->distance); - jk_printf(s, " state=%s", jk_lb_get_state(wr, l)); - jk_printf(s, " lbmult=%" JK_UINT64_T_FMT, wr->lb_mult); - jk_printf(s, " lbvalue=%" JK_UINT64_T_FMT, wr->s->lb_value); - jk_printf(s, " elected=%" JK_UINT64_T_FMT, aw->s->used); - jk_printf(s, " errors=%" JK_UINT32_T_FMT, wr->s->errors); - } - else { - jk_printf(s, " used=%" JK_UINT64_T_FMT, aw->s->used); - jk_printf(s, " errors=%" JK_UINT32_T_FMT, aw->s->errors); - } - jk_printf(s, " client_errors=%" JK_UINT32_T_FMT, aw->s->client_errors); - jk_printf(s, " reply_timeouts=%" JK_UINT32_T_FMT, aw->s->reply_timeouts); - jk_printf(s, " transferred=%" JK_UINT64_T_FMT, aw->s->transferred); - jk_printf(s, " read=%" JK_UINT64_T_FMT, aw->s->readed); - jk_printf(s, " busy=%d", aw->s->busy); - jk_printf(s, " max_busy=%d", aw->s->max_busy); - jk_printf(s, " connected=%d", aw->s->connected); - if (lb) { - jk_printf(s, " time_to_recover_min=%d", rs_min); - jk_printf(s, " time_to_recover_max=%d", rs_max); - } - else - jk_printf(s, " map_count=%d", map_count); - jk_printf(s, " last_reset_at=%ld", (long)aw->s->last_reset); - jk_printf(s, " last_reset_ago=%d", delta_reset); - if (rc_time > 0) { - jk_printf(s, " error_time_datetime=%s", buf_time); - jk_printf(s, " error_time_tz=%s", buf_tz); - jk_printf(s, " error_time_unix_seconds=%d", error_time); - jk_printf(s, " error_time_ago=%d", delta_error); - } - jk_puts(s, "\n"); - - } - else if (mime == JK_STATUS_MIME_PROP) { - - if (lb) { - jk_print_prop_att_string(s, w, name, "balance_workers", sub_name); - jk_print_prop_att_string(s, w, ajp_name, "type", status_worker_type(wr->worker->type)); - } - else { - jk_print_prop_att_string(s, w, name, "list", ajp_name); - jk_print_prop_att_string(s, w, ajp_name, "type", status_worker_type(aw->worker.type)); - } - jk_print_prop_att_string(s, w, ajp_name, "host", aw->host); - jk_print_prop_att_int(s, w, ajp_name, "port", aw->port); - jk_print_prop_att_string(s, w, ajp_name, "address", dump_ajp_addr(aw, buf)); - jk_print_prop_att_int(s, w, ajp_name, "connection_pool_timeout", aw->cache_timeout); - jk_print_prop_att_int(s, w, ajp_name, "ping_timeout", aw->ping_timeout); - jk_print_prop_att_int(s, w, ajp_name, "connect_timeout", aw->connect_timeout); - jk_print_prop_att_int(s, w, ajp_name, "prepost_timeout", aw->prepost_timeout); - jk_print_prop_att_int(s, w, ajp_name, "reply_timeout", aw->reply_timeout); - jk_print_prop_att_int(s, w, ajp_name, "retries", aw->retries); - jk_print_prop_att_int(s, w, ajp_name, "connection_ping_interval", aw->conn_ping_interval); - jk_print_prop_att_uint(s, w, ajp_name, "recovery_options", aw->recovery_opts); - jk_print_prop_att_uint(s, w, ajp_name, "max_packet_size", aw->max_packet_size); - if (lb) { - jk_print_prop_att_string(s, w, ajp_name, "activation", jk_lb_get_activation(wr, l)); - jk_print_prop_att_int(s, w, ajp_name, "lbfactor", wr->lb_factor); - jk_print_prop_att_string(s, w, ajp_name, "route", wr->route); - jk_print_prop_att_string(s, w, ajp_name, "redirect", wr->redirect); - jk_print_prop_att_string(s, w, ajp_name, "domain", wr->domain); - jk_print_prop_att_int(s, w, ajp_name, "distance", wr->distance); - jk_print_prop_att_string(s, w, ajp_name, "state", jk_lb_get_state(wr, l)); - jk_print_prop_att_uint64(s, w, ajp_name, "lbmult", wr->lb_mult); - jk_print_prop_att_uint64(s, w, ajp_name, "lbvalue", wr->s->lb_value); - jk_print_prop_att_uint64(s, w, ajp_name, "elected", aw->s->used); - jk_print_prop_att_uint32(s, w, ajp_name, "errors", wr->s->errors); - } - else { - jk_print_prop_att_uint64(s, w, ajp_name, "used", aw->s->used); - jk_print_prop_att_uint32(s, w, ajp_name, "errors", aw->s->errors); - } - jk_print_prop_att_uint32(s, w, ajp_name, "client_errors", aw->s->client_errors); - jk_print_prop_att_uint32(s, w, ajp_name, "reply_timeouts", aw->s->reply_timeouts); - jk_print_prop_att_uint64(s, w, ajp_name, "transferred", aw->s->transferred); - jk_print_prop_att_uint64(s, w, ajp_name, "read", aw->s->readed); - jk_print_prop_att_int(s, w, ajp_name, "busy", aw->s->busy); - jk_print_prop_att_int(s, w, ajp_name, "max_busy", aw->s->max_busy); - jk_print_prop_att_int(s, w, ajp_name, "connected", aw->s->connected); - if (lb) { - jk_print_prop_att_int(s, w, ajp_name, "time_to_recover_min", rs_min); - jk_print_prop_att_int(s, w, ajp_name, "time_to_recover_max", rs_max); - } - else - jk_print_prop_att_int(s, w, name, "map_count", map_count); - jk_print_prop_att_long(s, w, name, "last_reset_at", (long)aw->s->last_reset); - jk_print_prop_att_int(s, w, name, "last_reset_ago", delta_reset); - if (rc_time > 0) { - jk_print_prop_att_string(s, w, name, "error_time_datetime", buf_time); - jk_print_prop_att_string(s, w, name, "error_time_tz", buf_tz); - jk_print_prop_att_int(s, w, name, "error_time_unix seconds", (int)error_time); - jk_print_prop_att_int(s, w, name, "error_time_ago seconds", delta_error); - } - - } - JK_TRACE_EXIT(l); - -} - -static void display_worker_lb(jk_ws_service_t *s, - status_endpoint_t *p, - lb_worker_t *lb, - lb_sub_worker_t *swr, - jk_logger_t *l) -{ - int cmd; - int mime; - int read_only = 0; - int single = 0; - unsigned int hide_members; - unsigned int hide_lb_conf; - unsigned int hide_lb_summary; - unsigned int hide_ajp_conf; - const char *arg; - time_t now = time(NULL); - unsigned int good = 0; - unsigned int degraded = 0; - unsigned int bad = 0; - int map_count; - int ms_min; - int ms_max; - unsigned int j; - int pstart = JK_FALSE; - const char *name = lb->name; - status_worker_t *w = p->worker; - - JK_TRACE_ENTER(l); - status_get_string(p, JK_STATUS_ARG_CMD, NULL, &arg, l); - cmd = status_cmd_int(arg); - status_get_string(p, JK_STATUS_ARG_MIME, NULL, &arg, l); - mime = status_mime_int(arg); - hide_members = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) & - JK_STATUS_ARG_OPTION_NO_MEMBERS; - hide_lb_conf = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) & - JK_STATUS_ARG_OPTION_NO_LB_CONF; - hide_lb_summary = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) & - JK_STATUS_ARG_OPTION_NO_LB_SUMMARY; - hide_ajp_conf = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) & - JK_STATUS_ARG_OPTION_NO_AJP_CONF; - if (w->read_only) { - read_only = 1; - } - else { - read_only = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) & - JK_STATUS_ARG_OPTION_READ_ONLY; - } - if (cmd == JK_STATUS_CMD_SHOW) { - single = 1; - } - - if (lb->sequence != lb->s->h.sequence) - jk_lb_pull(lb, JK_FALSE, l); - - for (j = 0; j < lb->num_of_workers; j++) { - lb_sub_worker_t *wr = &(lb->lb_workers[j]); - int rate; - rate = status_rate(wr, w, l); - if (rate > 0 ) - good++; - else if (rate < 0 ) - bad++; - else - degraded++; - } - - map_count = count_maps(s, name, l); - ms_min = lb->maintain_time - (int)difftime(now, lb->s->last_maintain_time); - ms_max = ms_min + lb->maintain_time; - ms_min -= JK_LB_MAINTAIN_TOLERANCE; - if (ms_min < 0) { - ms_min = 0; - } - if (ms_max < 0) { - ms_max = 0; - } - - if (mime == JK_STATUS_MIME_HTML) { - - jk_puts(s, "

["); - if (single) { - jk_puts(s, "S"); - } - else { - status_write_uri(s, p, "S", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN, - name, "", 0, 0, "", l); - } - if (!read_only) { - jk_puts(s, "|"); - status_write_uri(s, p, "E", JK_STATUS_CMD_EDIT, JK_STATUS_MIME_UNKNOWN, - name, "", 0, 0, "", l); - jk_puts(s, "|"); - status_write_uri(s, p, "R", JK_STATUS_CMD_RESET, JK_STATUS_MIME_UNKNOWN, - name, "", 0, 0, "", l); - } - jk_puts(s, "]  "); - jk_putv(s, "Worker Status for ", name, "

\n", NULL); - if (hide_lb_conf) { - pstart = JK_TRUE; - jk_puts(s, "

\n"); - if (single) { - status_write_uri(s, p, "Show LB Configuration", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_LB_CONF, "", l); - } - else { - status_write_uri(s, p, "Show LB Configuration", JK_STATUS_CMD_LIST, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_LB_CONF, "", l); - } - } - if (hide_lb_summary) { - if (pstart == JK_FALSE) - jk_puts(s, "

\n"); - else - jk_puts(s, "  |  "); - pstart = JK_TRUE; - if (single) { - status_write_uri(s, p, "Show LB Summary", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_LB_SUMMARY, "", l); - } - else { - status_write_uri(s, p, "Show LB Summary", JK_STATUS_CMD_LIST, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_LB_SUMMARY, "", l); - } - } - if (!hide_members && hide_ajp_conf) { - if (pstart == JK_FALSE) - jk_puts(s, "

\n"); - else - jk_puts(s, "  |  "); - pstart = JK_TRUE; - if (single) { - status_write_uri(s, p, "Show AJP Configuration", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_AJP_CONF, "", l); - } - else { - status_write_uri(s, p, "Show AJP Configuration", JK_STATUS_CMD_LIST, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_AJP_CONF, "", l); - } - } - if (hide_members) { - if (pstart == JK_FALSE) - jk_puts(s, "

\n"); - else - jk_puts(s, "  |  "); - pstart = JK_TRUE; - if (single) { - status_write_uri(s, p, "Show Balancer Members", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_MEMBERS, "", l); - } - else { - status_write_uri(s, p, "Show Balancer Members", JK_STATUS_CMD_LIST, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_MEMBERS, "", l); - } - } - if (pstart == JK_TRUE) - jk_puts(s, "

\n"); - - if (!hide_lb_conf) { - jk_puts(s, "" JK_STATUS_SHOW_LB_HEAD); - jk_puts(s, "["); - status_write_uri(s, p, "Hide", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, JK_STATUS_ARG_OPTION_NO_LB_CONF, 0, NULL, l); - jk_puts(s, "]"); - jk_printf(s, JK_STATUS_SHOW_LB_ROW, - status_worker_type(JK_LB_WORKER_TYPE), - jk_get_bool(lb->sticky_session), - jk_get_bool(lb->sticky_session_force), - lb->retries, - jk_lb_get_method(lb, l), - jk_lb_get_lock(lb, l), - lb->recover_wait_time, - lb->error_escalation_time, - lb->max_reply_timeouts); - jk_puts(s, "
\n
\n"); - } - - if (!hide_lb_summary) { - jk_puts(s, "" - "\n"); - jk_printf(s, "", good); - jk_printf(s, "", degraded); - jk_printf(s, "", bad); - jk_printf(s, "", lb->s->busy); - jk_printf(s, "", lb->s->max_busy); - jk_printf(s, "", ms_min, ms_max); - jk_printf(s, "", (int)difftime(now, lb->s->last_reset)); - jk_puts(s, "\n
GoodDegradedBad/StoppedBusyMax BusyNext MaintenanceLast Reset["); - status_write_uri(s, p, "Hide", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, JK_STATUS_ARG_OPTION_NO_LB_SUMMARY, 0, NULL, l); - jk_puts(s, "]
%d%d%d%d%d%d/%d%d
\n\n"); - } - } - else if (mime == JK_STATUS_MIME_XML) { - - jk_print_xml_start_elt(s, w, 2, 0, "balancer"); - jk_print_xml_att_string(s, 4, "name", name); - jk_print_xml_att_string(s, 4, "type", status_worker_type(JK_LB_WORKER_TYPE)); - jk_print_xml_att_string(s, 4, "sticky_session", jk_get_bool(lb->sticky_session)); - jk_print_xml_att_string(s, 4, "sticky_session_force", jk_get_bool(lb->sticky_session_force)); - jk_print_xml_att_int(s, 4, "retries", lb->retries); - jk_print_xml_att_int(s, 4, "recover_time", lb->recover_wait_time); - jk_print_xml_att_int(s, 4, "error_escalation_time", lb->error_escalation_time); - jk_print_xml_att_int(s, 4, "max_reply_timeouts", lb->max_reply_timeouts); - jk_print_xml_att_string(s, 4, "method", jk_lb_get_method(lb, l)); - jk_print_xml_att_string(s, 4, "lock", jk_lb_get_lock(lb, l)); - jk_print_xml_att_int(s, 4, "member_count", lb->num_of_workers); - jk_print_xml_att_int(s, 4, "good", good); - jk_print_xml_att_int(s, 4, "degraded", degraded); - jk_print_xml_att_int(s, 4, "bad", bad); - jk_print_xml_att_int(s, 4, "busy", lb->s->busy); - jk_print_xml_att_int(s, 4, "max_busy", lb->s->max_busy); - jk_print_xml_att_int(s, 4, "map_count", map_count); - jk_print_xml_att_int(s, 4, "time_to_maintenance_min", ms_min); - jk_print_xml_att_int(s, 4, "time_to_maintenance_max", ms_max); - jk_print_xml_att_long(s, 4, "last_reset_at", (long)lb->s->last_reset); - jk_print_xml_att_int(s, 4, "last_reset_ago", (int)difftime(now, lb->s->last_reset)); - jk_print_xml_stop_elt(s, 2, 0); - - } - else if (mime == JK_STATUS_MIME_TXT) { - - jk_puts(s, "Balancer Worker:"); - jk_printf(s, " name=%s", name); - jk_printf(s, " type=%s", status_worker_type(JK_LB_WORKER_TYPE)); - jk_printf(s, " sticky_session=%s", jk_get_bool(lb->sticky_session)); - jk_printf(s, " sticky_session_force=%s", jk_get_bool(lb->sticky_session_force)); - jk_printf(s, " retries=%d", lb->retries); - jk_printf(s, " recover_time=%d", lb->recover_wait_time); - jk_printf(s, " error_escalation_time=%d", lb->error_escalation_time); - jk_printf(s, " max_reply_timeouts=%d", lb->max_reply_timeouts); - jk_printf(s, " method=%s", jk_lb_get_method(lb, l)); - jk_printf(s, " lock=%s", jk_lb_get_lock(lb, l)); - jk_printf(s, " member_count=%d", lb->num_of_workers); - jk_printf(s, " good=%d", good); - jk_printf(s, " degraded=%d", degraded); - jk_printf(s, " bad=%d", bad); - jk_printf(s, " busy=%d", lb->s->busy); - jk_printf(s, " max_busy=%d", lb->s->max_busy); - jk_printf(s, " map_count=%d", map_count); - jk_printf(s, " time_to_maintenance_min=%d", ms_min); - jk_printf(s, " time_to_maintenance_max=%d", ms_max); - jk_printf(s, " last_reset_at=%ld", (long)lb->s->last_reset); - jk_printf(s, " last_reset_ago=%d", (int)difftime(now, lb->s->last_reset)); - jk_puts(s, "\n"); - - } - else if (mime == JK_STATUS_MIME_PROP) { - - jk_print_prop_att_string(s, w, NULL, "list", name); - jk_print_prop_att_string(s, w, name, "type", status_worker_type(JK_LB_WORKER_TYPE)); - jk_print_prop_att_string(s, w, name, "sticky_session", jk_get_bool(lb->sticky_session)); - jk_print_prop_att_string(s, w, name, "sticky_session_force", jk_get_bool(lb->sticky_session_force)); - jk_print_prop_att_int(s, w, name, "retries", lb->retries); - jk_print_prop_att_int(s, w, name, "recover_time", lb->recover_wait_time); - jk_print_prop_att_int(s, w, name, "error_escalation_time", lb->error_escalation_time); - jk_print_prop_att_int(s, w, name, "max_reply_timeouts", lb->max_reply_timeouts); - jk_print_prop_att_string(s, w, name, "method", jk_lb_get_method(lb, l)); - jk_print_prop_att_string(s, w, name, "lock", jk_lb_get_lock(lb, l)); - jk_print_prop_att_int(s, w, name, "member_count", lb->num_of_workers); - jk_print_prop_att_int(s, w, name, "good", good); - jk_print_prop_att_int(s, w, name, "degraded", degraded); - jk_print_prop_att_int(s, w, name, "bad", bad); - jk_print_prop_att_int(s, w, name, "busy", lb->s->busy); - jk_print_prop_att_int(s, w, name, "max_busy", lb->s->max_busy); - jk_print_prop_att_int(s, w, name, "map_count", map_count); - jk_print_prop_att_int(s, w, name, "time_to_maintenance_min", ms_min); - jk_print_prop_att_int(s, w, name, "time_to_maintenance_max", ms_max); - jk_print_prop_att_long(s, w, name, "last_reset_at", (long)lb->s->last_reset); - jk_print_prop_att_int(s, w, name, "last_reset_ago", (int)difftime(now, lb->s->last_reset)); - - } - - if (!hide_members) { - - if (mime == JK_STATUS_MIME_HTML) { - - jk_puts(s, "

Balancer Members ["); - if (swr) { - status_write_uri(s, p, "Show All Members", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN, - name, "", 0, 0, "", l); - jk_puts(s, "]  ["); - } - if (single) { - status_write_uri(s, p, "Hide", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, JK_STATUS_ARG_OPTION_NO_MEMBERS, 0, "", l); - } - else { - status_write_uri(s, p, "Hide", JK_STATUS_CMD_LIST, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, JK_STATUS_ARG_OPTION_NO_MEMBERS, 0, "", l); - } - jk_puts(s, "]

\n"); - if (!hide_ajp_conf) { - jk_puts(s, "" JK_STATUS_SHOW_MEMBER_CONF_HEAD); - jk_puts(s, "["); - status_write_uri(s, p, "Hide", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, JK_STATUS_ARG_OPTION_NO_AJP_CONF, 0, NULL, l); - jk_puts(s, "]"); - if (swr) { - jk_worker_t *jw = (jk_worker_t *)swr->worker; - ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private; - display_worker_ajp_conf_details(s, p, aw, 1, jw->type, l); - } - else - for (j = 0; j < lb->num_of_workers; j++) { - lb_sub_worker_t *wr = &(lb->lb_workers[j]); - jk_worker_t *jw = (jk_worker_t *)wr->worker; - ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private; - display_worker_ajp_conf_details(s, p, aw, 1, jw->type, l); - } - jk_puts(s, "
\n
\n"); - } - jk_puts(s, "" JK_STATUS_SHOW_MEMBER_HEAD); - - } - - if (swr) { - const char *sub_name = swr->name; - ajp_worker_t *aw = (ajp_worker_t *)swr->worker->worker_private; - - if (mime == JK_STATUS_MIME_HTML) { - jk_puts(s, "\n"); - } - display_worker_ajp_details(s, p, aw, swr, lb, ms_min, ms_max, 0, l); - } else - for (j = 0; j < lb->num_of_workers; j++) { - lb_sub_worker_t *wr = &(lb->lb_workers[j]); - const char *sub_name = wr->name; - ajp_worker_t *aw = (ajp_worker_t *)wr->worker->worker_private; - - if (mime == JK_STATUS_MIME_HTML) { - jk_puts(s, "\n"); - } - display_worker_ajp_details(s, p, aw, wr, lb, ms_min, ms_max, 0, l); - } - - if (mime == JK_STATUS_MIME_HTML) { - - jk_puts(s, "
["); - jk_puts(s, "S"); - if (!read_only) { - jk_puts(s, "|"); - status_write_uri(s, p, "E", JK_STATUS_CMD_EDIT, JK_STATUS_MIME_UNKNOWN, - name, sub_name, 0, 0, "", l); - jk_puts(s, "|"); - status_write_uri(s, p, "R", JK_STATUS_CMD_RESET, JK_STATUS_MIME_UNKNOWN, - name, sub_name, 0, 0, "", l); - if (swr->s->state == JK_LB_STATE_ERROR) { - jk_puts(s, "|"); - status_write_uri(s, p, "T", JK_STATUS_CMD_RECOVER, JK_STATUS_MIME_UNKNOWN, - name, sub_name, 0, 0, "", l); - } - } - jk_puts(s, "]"); - jk_puts(s, " 
["); - status_write_uri(s, p, "S", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN, - name, sub_name, 0, 0, "", l); - if (!read_only) { - jk_puts(s, "|"); - status_write_uri(s, p, "E", JK_STATUS_CMD_EDIT, JK_STATUS_MIME_UNKNOWN, - name, sub_name, 0, 0, "", l); - jk_puts(s, "|"); - status_write_uri(s, p, "R", JK_STATUS_CMD_RESET, JK_STATUS_MIME_UNKNOWN, - name, sub_name, 0, 0, "", l); - if (wr->s->state == JK_LB_STATE_ERROR) { - jk_puts(s, "|"); - status_write_uri(s, p, "T", JK_STATUS_CMD_RECOVER, JK_STATUS_MIME_UNKNOWN, - name, sub_name, 0, 0, "", l); - } - } - jk_puts(s, "]"); - jk_puts(s, " 

\n"); - if (!read_only) { - const char *arg; - status_get_string(p, JK_STATUS_ARG_CMD, NULL, &arg, l); - status_start_form(s, p, "get", JK_STATUS_CMD_EDIT, NULL, l); - jk_printf(s, JK_STATUS_FORM_HIDDEN_STRING, JK_STATUS_ARG_WORKER, name); - if (arg) - jk_printf(s, JK_STATUS_FORM_HIDDEN_STRING, JK_STATUS_ARG_FROM, arg); - jk_puts(s, "
Edit this attribute for all members:"); - jk_putv(s, "
\n"); - } - - } - - } - - if (name) - display_maps(s, p, name, l); - - if (mime == JK_STATUS_MIME_XML) { - jk_print_xml_close_elt(s, w, 2, "balancer"); - } - - JK_TRACE_EXIT(l); -} - -static void display_worker_ajp(jk_ws_service_t *s, - status_endpoint_t *p, - ajp_worker_t *aw, - int type, - jk_logger_t *l) -{ - int cmd; - int mime; - int read_only = 0; - int single = 0; - unsigned int hide_ajp_conf; - const char *arg; - int map_count; - const char *name = aw->name; - status_worker_t *w = p->worker; - - JK_TRACE_ENTER(l); - status_get_string(p, JK_STATUS_ARG_CMD, NULL, &arg, l); - cmd = status_cmd_int(arg); - status_get_string(p, JK_STATUS_ARG_MIME, NULL, &arg, l); - mime = status_mime_int(arg); - hide_ajp_conf = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) & - JK_STATUS_ARG_OPTION_NO_AJP_CONF; - if (w->read_only) { - read_only = 1; - } - else { - read_only = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) & - JK_STATUS_ARG_OPTION_READ_ONLY; - } - if (cmd == JK_STATUS_CMD_SHOW) { - single = 1; - } - - if (aw->sequence != aw->s->h.sequence) - jk_ajp_pull(aw, JK_FALSE, l); - - map_count = count_maps(s, name, l); - - if (mime == JK_STATUS_MIME_HTML) { - - jk_puts(s, "

["); - if (single) - jk_puts(s, "S"); - else - status_write_uri(s, p, "S", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN, - name, "", 0, 0, "", l); - if (!read_only) { - jk_puts(s, "|"); - status_write_uri(s, p, "E", JK_STATUS_CMD_EDIT, JK_STATUS_MIME_UNKNOWN, - name, "", 0, 0, "", l); - jk_puts(s, "|"); - status_write_uri(s, p, "R", JK_STATUS_CMD_RESET, JK_STATUS_MIME_UNKNOWN, - name, "", 0, 0, "", l); - } - jk_puts(s, "]  "); - jk_putv(s, "Worker Status for ", name, "

\n", NULL); - if (!hide_ajp_conf) { - jk_puts(s, "" JK_STATUS_SHOW_AJP_CONF_HEAD); - jk_puts(s, "["); - status_write_uri(s, p, "Hide", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, JK_STATUS_ARG_OPTION_NO_AJP_CONF, 0, NULL, l); - jk_puts(s, "]"); - display_worker_ajp_conf_details(s, p, aw, 0, type, l); - jk_puts(s, "
\n
\n"); - } - else { - jk_puts(s, "

\n"); - if (single) { - status_write_uri(s, p, "Show AJP Configuration", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_AJP_CONF, "", l); - } - else { - status_write_uri(s, p, "Show AJP Configuration", JK_STATUS_CMD_LIST, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_AJP_CONF, "", l); - } - jk_puts(s, "

\n"); - } - jk_puts(s, "" JK_STATUS_SHOW_AJP_HEAD); - } - display_worker_ajp_details(s, p, aw, NULL, NULL, 0, 0, map_count, l); - - if (mime == JK_STATUS_MIME_HTML) { - jk_puts(s, "
\n"); - } - if (name) - display_maps(s, p, name, l); - - JK_TRACE_EXIT(l); -} - -static void display_worker(jk_ws_service_t *s, - status_endpoint_t *p, - jk_worker_t *jw, - lb_sub_worker_t *swr, - jk_logger_t *l) -{ - status_worker_t *w = p->worker; - - JK_TRACE_ENTER(l); - if (jw->type == JK_LB_WORKER_TYPE) { - lb_worker_t *lb = (lb_worker_t *)jw->worker_private; - if (lb) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' %s lb worker '%s'", - w->name, "displaying", lb->name); - display_worker_lb(s, p, lb, swr, l); - } - else { - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' lb worker is (null)", - w->name); - } - } - else if (jw->type == JK_AJP13_WORKER_TYPE || - jw->type == JK_AJP14_WORKER_TYPE) { - ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private; - if (aw) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' %s ajp worker '%s'", - w->name, "displaying", aw->name); - display_worker_ajp(s, p, aw, jw->type, l); - } - else { - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' aw worker is (null)", - w->name); - } - } - else { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' worker type not implemented", - w->name); - JK_TRACE_EXIT(l); - return; - } -} - -static void form_worker(jk_ws_service_t *s, - status_endpoint_t *p, - jk_worker_t *jw, - jk_logger_t *l) -{ - const char *name = NULL; - lb_worker_t *lb = NULL; - status_worker_t *w = p->worker; - - JK_TRACE_ENTER(l); - if (jw->type == JK_LB_WORKER_TYPE) { - lb = (lb_worker_t *)jw->worker_private; - name = lb->name; - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' producing edit form for lb worker '%s'", - w->name, name); - } - else { - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' worker type not implemented", - w->name); - JK_TRACE_EXIT(l); - return; - } - - if (!lb) { - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' lb structure is (null)", - w->name); - JK_TRACE_EXIT(l); - return; - } - - jk_putv(s, "

Edit load balancer settings for ", - name, "

\n", NULL); - - status_start_form(s, p, "get", JK_STATUS_CMD_UPDATE, NULL, l); - - jk_putv(s, "\n\n", lb->retries); - jk_putv(s, "\n", lb->retry_interval); - jk_putv(s, "\n", lb->recover_wait_time); - jk_putv(s, "\n", lb->error_escalation_time); - jk_putv(s, "\n", lb->max_reply_timeouts); - jk_putv(s, "\n"); - jk_putv(s, "\n"); - jk_putv(s, "\n", NULL); - jk_putv(s, "\n"); - jk_putv(s, "\n"); - jk_putv(s, "\n"); - jk_putv(s, "\n"); - jk_putv(s, "\n", NULL); - jk_putv(s, "\n"); - jk_putv(s, "\n"); - jk_puts(s, "
", JK_STATUS_ARG_LB_TEXT_RETRIES, - ":
", JK_STATUS_ARG_LB_TEXT_RETRY_INT, - ":
", JK_STATUS_ARG_LB_TEXT_RECOVER_TIME, - ":
", JK_STATUS_ARG_LB_TEXT_ERROR_ESCALATION_TIME, - ":
", JK_STATUS_ARG_LB_TEXT_MAX_REPLY_TIMEOUTS, - ":
", JK_STATUS_ARG_LB_TEXT_STICKY, - ":sticky_session) - jk_puts(s, " checked=\"checked\""); - jk_puts(s, "/>
", JK_STATUS_ARG_LB_TEXT_STICKY_FORCE, - ":sticky_session_force) - jk_puts(s, " checked=\"checked\""); - jk_puts(s, "/>
", JK_STATUS_ARG_LB_TEXT_METHOD, - ":
  Requestslbmethod == JK_LB_METHOD_REQUESTS) - jk_puts(s, " checked=\"checked\""); - jk_puts(s, "/>
  Trafficlbmethod == JK_LB_METHOD_TRAFFIC) - jk_puts(s, " checked=\"checked\""); - jk_puts(s, "/>
  Busynesslbmethod == JK_LB_METHOD_BUSYNESS) - jk_puts(s, " checked=\"checked\""); - jk_puts(s, "/>
  Sessionslbmethod == JK_LB_METHOD_SESSIONS) - jk_puts(s, " checked=\"checked\""); - jk_puts(s, "/>
", JK_STATUS_ARG_LB_TEXT_LOCK, - ":
  Optimisticlblock == JK_LB_LOCK_OPTIMISTIC) - jk_puts(s, " checked=\"checked\""); - jk_puts(s, "/>
  Pessimisticlblock == JK_LB_LOCK_PESSIMISTIC) - jk_puts(s, " checked=\"checked\""); - jk_puts(s, "/>
\n"); - jk_puts(s, "
\n"); - - JK_TRACE_EXIT(l); -} - -static void form_member(jk_ws_service_t *s, - status_endpoint_t *p, - lb_sub_worker_t *wr, - ajp_worker_t *aw, - const char *lb_name, - jk_logger_t *l) -{ - status_worker_t *w = p->worker; - - JK_TRACE_ENTER(l); - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' producing edit form for sub worker '%s' of lb worker '%s'", - w->name, wr? wr->name : aw->name, lb_name); - - jk_putv(s, "

Edit worker settings for ", - wr? wr->name : aw->name, "

\n", NULL); - status_start_form(s, p, "get", JK_STATUS_CMD_UPDATE, NULL, l); - - if (wr) { - jk_puts(s, "\n"); - jk_puts(s, "\n"); - jk_puts(s, "\n"); - jk_puts(s, "
Balancing related settings  AJP settings
\n"); - jk_putv(s, "\n", NULL); - jk_putv(s, "\n"); - jk_putv(s, "\n"); - jk_putv(s, "\n"); - jk_putv(s, "\n", wr->lb_factor); - jk_putv(s, "\n", wr->route); - jk_putv(s, "\n"); - jk_putv(s, "\n"); - jk_putv(s, "\n", wr->distance); - jk_puts(s, "
", JK_STATUS_ARG_LBM_TEXT_ACTIVATION, - ":
  Activeactivation == JK_LB_ACTIVATION_ACTIVE) - jk_puts(s, " checked=\"checked\""); - jk_puts(s, "/>
  Disabledactivation == JK_LB_ACTIVATION_DISABLED) - jk_puts(s, " checked=\"checked\""); - jk_puts(s, "/>
  Stoppedactivation == JK_LB_ACTIVATION_STOPPED) - jk_puts(s, " checked=\"checked\""); - jk_puts(s, "/>
", JK_STATUS_ARG_LBM_TEXT_FACTOR, - ":
", JK_STATUS_ARG_LBM_TEXT_ROUTE, - ":
", JK_STATUS_ARG_LBM_TEXT_REDIRECT, - ":redirect, NULL); - jk_puts(s, "\"/>
", JK_STATUS_ARG_LBM_TEXT_DOMAIN, - ":domain, NULL); - jk_puts(s, "\"/>
", JK_STATUS_ARG_LBM_TEXT_DISTANCE, - ":
\n"); - jk_puts(s, "
\n"); - } - - jk_puts(s, "\n"); - jk_putv(s, "\n", aw->host); - jk_putv(s, "\n", aw->port); - - jk_putv(s, "\n", aw->cache_timeout); - jk_putv(s, "\n", aw->ping_timeout); - jk_putv(s, "\n", aw->connect_timeout); - jk_putv(s, "\n", aw->prepost_timeout); - jk_putv(s, "\n", aw->reply_timeout); - jk_putv(s, "\n", aw->retries); - jk_putv(s, "\n", aw->retry_interval); - jk_putv(s, "\n", aw->conn_ping_interval); - jk_putv(s, "\n", aw->recovery_opts); - jk_putv(s, "\n", aw->max_packet_size); - jk_puts(s, "
", JK_STATUS_ARG_AJP_TEXT_HOST_STR, - ":
", JK_STATUS_ARG_AJP_TEXT_PORT, - ":
", JK_STATUS_ARG_AJP_TEXT_CACHE_TO, - ":
", JK_STATUS_ARG_AJP_TEXT_PING_TO, - ":
", JK_STATUS_ARG_AJP_TEXT_CONNECT_TO, - ":
", JK_STATUS_ARG_AJP_TEXT_PREPOST_TO, - ":
", JK_STATUS_ARG_AJP_TEXT_REPLY_TO, - ":
", JK_STATUS_ARG_AJP_TEXT_RETRIES, - ":
", JK_STATUS_ARG_AJP_TEXT_RETRY_INT, - ":
", JK_STATUS_ARG_AJP_TEXT_CPING_INT, - ":
", JK_STATUS_ARG_AJP_TEXT_REC_OPTS, - ":
", JK_STATUS_ARG_AJP_TEXT_MAX_PK_SZ, - ":
\n"); - if (wr) - jk_puts(s, "
\n"); - jk_puts(s, "
\n\n"); - JK_TRACE_EXIT(l); -} - -static void form_all_members(jk_ws_service_t *s, - status_endpoint_t *p, - jk_worker_t *jw, - const char *attribute, - jk_logger_t *l) -{ - const char *name = NULL; - lb_worker_t *lb = NULL; - status_worker_t *w = p->worker; - const char *aname; - unsigned int i; - - JK_TRACE_ENTER(l); - if (!attribute) { - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' missing request parameter '%s'", - w->name, JK_STATUS_ARG_ATTRIBUTE); - JK_TRACE_EXIT(l); - return; - } - else { - if (!strcmp(attribute, JK_STATUS_ARG_LBM_ACTIVATION)) - aname=JK_STATUS_ARG_LBM_TEXT_ACTIVATION; - else if (!strcmp(attribute, JK_STATUS_ARG_LBM_FACTOR)) - aname=JK_STATUS_ARG_LBM_TEXT_FACTOR; - else if (!strcmp(attribute, JK_STATUS_ARG_LBM_ROUTE)) - aname=JK_STATUS_ARG_LBM_TEXT_ROUTE; - else if (!strcmp(attribute, JK_STATUS_ARG_LBM_REDIRECT)) - aname=JK_STATUS_ARG_LBM_TEXT_REDIRECT; - else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DOMAIN)) - aname=JK_STATUS_ARG_LBM_TEXT_DOMAIN; - else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DISTANCE)) - aname=JK_STATUS_ARG_LBM_TEXT_DISTANCE; - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CACHE_TO)) - aname=JK_STATUS_ARG_AJP_TEXT_CACHE_TO; - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_PING_TO)) - aname=JK_STATUS_ARG_AJP_TEXT_PING_TO; - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CONNECT_TO)) - aname=JK_STATUS_ARG_AJP_TEXT_CONNECT_TO; - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_PREPOST_TO)) - aname=JK_STATUS_ARG_AJP_TEXT_PREPOST_TO; - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_REPLY_TO)) - aname=JK_STATUS_ARG_AJP_TEXT_REPLY_TO; - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_RETRIES)) - aname=JK_STATUS_ARG_AJP_TEXT_RETRIES; - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_RETRY_INT)) - aname=JK_STATUS_ARG_AJP_TEXT_RETRY_INT; - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CPING_INT)) - aname=JK_STATUS_ARG_AJP_TEXT_CPING_INT; - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_REC_OPTS)) - aname=JK_STATUS_ARG_AJP_TEXT_REC_OPTS; - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_MAX_PK_SZ)) - aname=JK_STATUS_ARG_AJP_TEXT_MAX_PK_SZ; - else { - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' unknown attribute '%s'", - w->name, attribute); - JK_TRACE_EXIT(l); - return; - } - } - if (jw->type == JK_LB_WORKER_TYPE) { - lb = (lb_worker_t *)jw->worker_private; - name = lb->name; - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' producing edit form for attribute '%s' [%s] of all members of lb worker '%s'", - w->name, attribute, aname, name); - } - else { - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' worker type not implemented", - w->name); - JK_TRACE_EXIT(l); - return; - } - - if (lb) { - jk_putv(s, "

Edit attribute '", aname, - "' for all members of load balancer ", - name, "

\n", NULL); - - status_start_form(s, p, "get", JK_STATUS_CMD_UPDATE, NULL, l); - - jk_putv(s, "" - "" - "", NULL); - - for (i = 0; i < lb->num_of_workers; i++) { - lb_sub_worker_t *wr = &(lb->lb_workers[i]); - jk_worker_t *jw = wr->worker; - ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private;; - - jk_putv(s, ""); - } - - jk_puts(s, "
Balanced Worker", aname, "
", wr->name, "\n", NULL); - - if (!strcmp(attribute, JK_STATUS_ARG_LBM_ACTIVATION)) { - - jk_printf(s, "Active: activation == JK_LB_ACTIVATION_ACTIVE) - jk_puts(s, " checked=\"checked\""); - jk_puts(s, "/> | \n"); - jk_printf(s, "Disabled: activation == JK_LB_ACTIVATION_DISABLED) - jk_puts(s, " checked=\"checked\""); - jk_puts(s, "/> | \n"); - jk_printf(s, "Stopped: activation == JK_LB_ACTIVATION_STOPPED) - jk_puts(s, " checked=\"checked\""); - jk_puts(s, "/>\n"); - - } - else if (!strcmp(attribute, JK_STATUS_ARG_LBM_FACTOR)) { - jk_printf(s, "\n", wr->lb_factor); - } - else if (!strcmp(attribute, JK_STATUS_ARG_LBM_ROUTE)) { - jk_printf(s, "route, "\"/>\n", NULL); - } - else if (!strcmp(attribute, JK_STATUS_ARG_LBM_REDIRECT)) { - jk_printf(s, "redirect, "\"/>\n", NULL); - } - else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DOMAIN)) { - jk_printf(s, "domain, "\"/>\n", NULL); - } - else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DISTANCE)) { - jk_printf(s, "\n", wr->distance); - } - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CACHE_TO)) { - jk_printf(s, "\n", aw->cache_timeout); - } - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_PING_TO)) { - jk_printf(s, "\n", aw->ping_timeout); - } - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CONNECT_TO)) { - jk_printf(s, "\n", aw->connect_timeout); - } - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_PREPOST_TO)) { - jk_printf(s, "\n", aw->prepost_timeout); - } - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_REPLY_TO)) { - jk_printf(s, "\n", aw->reply_timeout); - } - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_RETRIES)) { - jk_printf(s, "\n", aw->retries); - } - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_RETRY_INT)) { - jk_printf(s, "\n", aw->retry_interval); - } - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CPING_INT)) { - jk_printf(s, "\n", aw->conn_ping_interval); - } - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_REC_OPTS)) { - jk_printf(s, "\n", aw->recovery_opts); - } - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_MAX_PK_SZ)) { - jk_printf(s, "\n", aw->max_packet_size); - } - - jk_puts(s, "
\n"); - jk_puts(s, "
\n"); - } - JK_TRACE_EXIT(l); -} - -static void commit_worker(jk_ws_service_t *s, - status_endpoint_t *p, - jk_worker_t *jw, - jk_logger_t *l) -{ - const char *name = NULL; - lb_worker_t *lb = NULL; - status_worker_t *w = p->worker; - const char *arg; - int sync_needed = JK_FALSE; - int i; - - JK_TRACE_ENTER(l); - if (jw->type == JK_LB_WORKER_TYPE) { - lb = (lb_worker_t *)jw->worker_private; - name = lb->name; - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' committing changes for lb worker '%s'", - w->name, name); - } - else { - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' worker type not implemented", - w->name); - JK_TRACE_EXIT(l); - return; - } - - if (!lb) { - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' lb structure is (null)", - w->name); - JK_TRACE_EXIT(l); - return; - } - - i = status_get_int(p, JK_STATUS_ARG_LB_RETRIES, - lb->retries, l); - if (i != lb->retries && i > 0) { - jk_log(l, JK_LOG_INFO, - "Status worker '%s' setting 'retries' for lb worker '%s' to '%i'", - w->name, name, i); - lb->retries = i; - sync_needed = JK_TRUE; - } - i = status_get_int(p, JK_STATUS_ARG_LB_RETRY_INT, - lb->retry_interval, l); - if (i != lb->retry_interval && i > 0) { - jk_log(l, JK_LOG_INFO, - "Status worker '%s' setting 'retry_interval' for lb worker '%s' to '%i'", - w->name, name, i); - lb->retry_interval = i; - sync_needed = JK_TRUE; - } - i = status_get_int(p, JK_STATUS_ARG_LB_RECOVER_TIME, - lb->recover_wait_time, l); - if (i != lb->recover_wait_time && i > 0) { - jk_log(l, JK_LOG_INFO, - "Status worker '%s' setting 'recover_time' for lb worker '%s' to '%i'", - w->name, name, i); - lb->recover_wait_time = i; - sync_needed = JK_TRUE; - } - i = status_get_int(p, JK_STATUS_ARG_LB_ERROR_ESCALATION_TIME, - lb->error_escalation_time, l); - if (i != lb->error_escalation_time && i > 0) { - jk_log(l, JK_LOG_INFO, - "Status worker '%s' setting 'error_escalation_time' for lb worker '%s' to '%i'", - w->name, name, i); - lb->error_escalation_time = i; - sync_needed = JK_TRUE; - } - i = status_get_int(p, JK_STATUS_ARG_LB_MAX_REPLY_TIMEOUTS, - lb->max_reply_timeouts, l); - if (i != lb->max_reply_timeouts && i >= 0) { - jk_log(l, JK_LOG_INFO, - "Status worker '%s' setting 'max_reply_timeouts' for lb worker '%s' to '%i'", - w->name, name, i); - lb->max_reply_timeouts = i; - sync_needed = JK_TRUE; - } - i = status_get_bool(p, JK_STATUS_ARG_LB_STICKY, lb->sticky_session, l); - if (i != lb->sticky_session) { - jk_log(l, JK_LOG_INFO, - "Status worker '%s' setting 'sticky_session' for lb worker '%s' to '%i'", - w->name, name, i); - lb->sticky_session = i; - sync_needed = JK_TRUE; - } - i = status_get_bool(p, JK_STATUS_ARG_LB_STICKY_FORCE, lb->sticky_session_force, l); - if (i != lb->sticky_session_force) { - jk_log(l, JK_LOG_INFO, - "Status worker '%s' setting 'sticky_session_force' for lb worker '%s' to '%i'", - w->name, name, i); - lb->sticky_session_force = i; - sync_needed = JK_TRUE; - } - if (status_get_string(p, JK_STATUS_ARG_LB_METHOD, NULL, &arg, l) == JK_TRUE) { - i = jk_lb_get_method_code(arg); - if (i != lb->lbmethod && i >= 0 && i <= JK_LB_METHOD_MAX) { - jk_log(l, JK_LOG_INFO, - "Status worker '%s' setting 'method' for lb worker '%s' to '%s'", - w->name, name, jk_lb_get_method(lb, l)); - lb->lbmethod = i; - sync_needed = JK_TRUE; - } - } - if (status_get_string(p, JK_STATUS_ARG_LB_LOCK, NULL, &arg, l) == JK_TRUE) { - i = jk_lb_get_lock_code(arg); - if (i != lb->lblock && i >= 0 && i <= JK_LB_LOCK_MAX) { - jk_log(l, JK_LOG_INFO, - "Status worker '%s' setting 'lock' for lb worker '%s' to '%s'", - w->name, name, jk_lb_get_lock(lb, l)); - lb->lblock = i; - sync_needed = JK_TRUE; - } - } - if (sync_needed == JK_TRUE) { - lb->sequence++; - jk_lb_push(lb, JK_TRUE, l); - } -} - -static int set_int_if_changed(status_endpoint_t *p, - const char *name, - const char *att, - const char *arg, - int min, - int max, - int *param, - const char *lb_name, - jk_logger_t *l) -{ - int i; - status_worker_t *w = p->worker; - i = status_get_int(p, arg, *param, l); - if (i != *param && i >= min && i <= max) { - if (lb_name) - jk_log(l, JK_LOG_INFO, - "Status worker '%s' setting '%s' for sub worker '%s' of lb worker '%s' to '%i'", - w->name, att, name, lb_name, i); - else - jk_log(l, JK_LOG_INFO, - "Status worker '%s' setting '%s' for ajp worker '%s' to '%i'", - w->name, att, name, i); - *param = i; - return JK_TRUE; - } - return JK_FALSE; -} - -static int set_uint_if_changed(status_endpoint_t *p, - const char *name, - const char *att, - const char *arg, - unsigned int min, - unsigned int max, - unsigned int *param, - const char *lb_name, - jk_logger_t *l) -{ - unsigned i; - status_worker_t *w = p->worker; - i = (unsigned)status_get_int(p, arg, *param, l); - if (i != *param && i >= min && i <= max) { - if (lb_name) - jk_log(l, JK_LOG_INFO, - "Status worker '%s' setting '%s' for sub worker '%s' of lb worker '%s' to '%u'", - w->name, att, name, lb_name, i); - else - jk_log(l, JK_LOG_INFO, - "Status worker '%s' setting '%s' for ajp worker '%s' to '%u'", - w->name, att, name, i); - *param = i; - return JK_TRUE; - } - return JK_FALSE; -} - -static int commit_member(jk_ws_service_t *s, - status_endpoint_t *p, - lb_worker_t *lb, - lb_sub_worker_t *wr, - ajp_worker_t *aw, - int *side_effect, - jk_logger_t *l) -{ - const char *arg; - const char *lb_name = NULL; - status_worker_t *w = p->worker; - int rc = JK_TRUE; - int rv; - int i; - int old; - int resolve = JK_FALSE; - char host[JK_SHM_STR_SIZ+1]; - int port = 0; - - JK_TRACE_ENTER(l); - if (lb) { - lb_name = lb->name; - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' committing changes for sub worker '%s' of lb worker '%s'", - w->name, wr->name, lb_name); - } - else { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' committing changes for ajp worker '%s'", - w->name, aw->name); - } - - if (lb) { - if (status_get_string(p, JK_STATUS_ARG_LBM_ACTIVATION, NULL, &arg, l) == JK_TRUE) { - i = jk_lb_get_activation_code(arg); - if (i != wr->activation && i >= 0 && i <= JK_LB_ACTIVATION_MAX) { - wr->activation = i; - jk_log(l, JK_LOG_INFO, - "Status worker '%s' setting 'activation' for sub worker '%s' of lb worker '%s' to '%s'", - w->name, wr->name, lb_name, jk_lb_get_activation(wr, l)); - *side_effect |= JK_STATUS_NEEDS_RESET_LB_VALUES | JK_STATUS_NEEDS_PUSH; - } - } - if (set_int_if_changed(p, wr->name, "lbfactor", JK_STATUS_ARG_LBM_FACTOR, - 1, INT_MAX, &wr->lb_factor, lb_name, l)) - /* Recalculate the load multiplicators wrt. lb_factor */ - *side_effect |= JK_STATUS_NEEDS_UPDATE_MULT | JK_STATUS_NEEDS_PUSH; - if ((rv = status_get_string(p, JK_STATUS_ARG_LBM_ROUTE, - NULL, &arg, l)) == JK_TRUE) { - if (strncmp(wr->route, arg, JK_SHM_STR_SIZ)) { - jk_log(l, JK_LOG_INFO, - "Status worker '%s' setting 'route' for sub worker '%s' of lb worker '%s' to '%s'", - w->name, wr->name, lb_name, arg); - strncpy(wr->route, arg, JK_SHM_STR_SIZ); - *side_effect |= JK_STATUS_NEEDS_PUSH; - if (!wr->domain[0]) { - char * id_domain = strchr(wr->route, '.'); - if (id_domain) { - *id_domain = '\0'; - strcpy(wr->domain, wr->route); - *id_domain = '.'; - } - } - } - } - if ((rv = status_get_string(p, JK_STATUS_ARG_LBM_REDIRECT, - NULL, &arg, l)) == JK_TRUE) { - if (strncmp(wr->redirect, arg, JK_SHM_STR_SIZ)) { - jk_log(l, JK_LOG_INFO, - "Status worker '%s' setting 'redirect' for sub worker '%s' of lb worker '%s' to '%s'", - w->name, wr->name, lb_name, arg); - strncpy(wr->redirect, arg, JK_SHM_STR_SIZ); - *side_effect |= JK_STATUS_NEEDS_PUSH; - } - } - if ((rv = status_get_string(p, JK_STATUS_ARG_LBM_DOMAIN, - NULL, &arg, l)) == JK_TRUE) { - if (strncmp(wr->domain, arg, JK_SHM_STR_SIZ)) { - jk_log(l, JK_LOG_INFO, - "Status worker '%s' setting 'domain' for sub worker '%s' of lb worker '%s' to '%s'", - w->name, wr->name, lb_name, arg); - strncpy(wr->domain, arg, JK_SHM_STR_SIZ); - *side_effect |= JK_STATUS_NEEDS_PUSH; - } - } - if (set_int_if_changed(p, wr->name, "distance", JK_STATUS_ARG_LBM_DISTANCE, - 0, INT_MAX, &wr->distance, lb_name, l)) - *side_effect |= JK_STATUS_NEEDS_PUSH; - } - old = aw->cache_timeout; - if (set_int_if_changed(p, aw->name, "connection_pool_timeout", JK_STATUS_ARG_AJP_CACHE_TO, - 0, INT_MAX, &aw->cache_timeout, lb_name, l)) { - *side_effect |= JK_STATUS_NEEDS_PUSH; - if (old == 0) { - unsigned int i; - for (i = 0; i < aw->ep_cache_sz; i++) { - ajp_endpoint_t *ae = (ajp_endpoint_t *) aw->ep_cache[i]; - if (ae) - ae->last_access = time(NULL); - } - } - } - port = aw->port; - if (set_int_if_changed(p, aw->name, "port", JK_STATUS_ARG_AJP_PORT, - 0, INT_MAX, &port, lb_name, l)) { - strncpy(host, aw->host, JK_SHM_STR_SIZ); - resolve = JK_TRUE; - } - if ((rv = status_get_string(p, JK_STATUS_ARG_AJP_HOST_STR, - NULL, &arg, l)) == JK_TRUE) { - if (strncmp(aw->host, arg, JK_SHM_STR_SIZ)) { - jk_log(l, JK_LOG_INFO, - "Status worker '%s' setting 'host' for sub worker '%s' to '%s'", - w->name, aw->name, arg); - strncpy(host, arg, JK_SHM_STR_SIZ); - resolve = JK_TRUE; - } - } - if (resolve == JK_TRUE) { - struct sockaddr_in inet_addr; - if (!jk_resolve(host, port, &inet_addr, - aw->worker.we->pool, l)) { - const char *msg = "Update failed (at least partially): could not resolve address '%s:%d' for sub worker '%s'."; - size_t size = strlen(msg) + strlen(host) + strlen(aw->name) + 10 + 1; - p->msg = jk_pool_alloc(s->pool, size); - snprintf(p->msg, size, msg, host, port, aw->name); - jk_log(l, JK_LOG_ERROR, - "Status worker '%s' failed resolving address '%s:%d' for sub worker '%s'.", - w->name, host, port, aw->name); - rc = JK_FALSE; - } - else { - /* This is not atomic and not thread safe */ - aw->port = port; - strncpy(aw->host, host, JK_SHM_STR_SIZ); - memcpy(&(aw->worker_inet_addr), &inet_addr, sizeof(inet_addr)); - *side_effect |= JK_STATUS_NEEDS_PUSH | JK_STATUS_NEEDS_ADDR_PUSH; - } - } - if (set_int_if_changed(p, aw->name, "ping_timeout", JK_STATUS_ARG_AJP_PING_TO, - 0, INT_MAX, &aw->ping_timeout, lb_name, l)) - *side_effect |= JK_STATUS_NEEDS_PUSH; - if (set_int_if_changed(p, aw->name, "connect_timeout", JK_STATUS_ARG_AJP_CONNECT_TO, - 0, INT_MAX, &aw->connect_timeout, lb_name, l)) - *side_effect |= JK_STATUS_NEEDS_PUSH; - if (set_int_if_changed(p, aw->name, "prepost_timeout", JK_STATUS_ARG_AJP_PREPOST_TO, - 0, INT_MAX, &aw->prepost_timeout, lb_name, l)) - *side_effect |= JK_STATUS_NEEDS_PUSH; - if (set_int_if_changed(p, aw->name, "reply_timeout", JK_STATUS_ARG_AJP_REPLY_TO, - 0, INT_MAX, &aw->reply_timeout, lb_name, l)) - *side_effect |= JK_STATUS_NEEDS_PUSH; - if (set_int_if_changed(p, aw->name, "retries", JK_STATUS_ARG_AJP_RETRIES, - 1, INT_MAX, &aw->retries, lb_name, l)) - *side_effect |= JK_STATUS_NEEDS_PUSH; - if (set_int_if_changed(p, aw->name, "retry_interval", JK_STATUS_ARG_AJP_RETRY_INT, - 1, INT_MAX, &aw->retry_interval, lb_name, l)) - *side_effect |= JK_STATUS_NEEDS_PUSH; - if (set_int_if_changed(p, aw->name, "connection_ping_interval", JK_STATUS_ARG_AJP_CPING_INT, - 1, INT_MAX, &aw->conn_ping_interval, lb_name, l)) - *side_effect |= JK_STATUS_NEEDS_PUSH; - if (set_uint_if_changed(p, aw->name, "recovery_options", JK_STATUS_ARG_AJP_REC_OPTS, - 0, INT_MAX, &aw->recovery_opts, lb_name, l)) - *side_effect |= JK_STATUS_NEEDS_PUSH; - if (set_uint_if_changed(p, aw->name, "max_packet_size", JK_STATUS_ARG_AJP_MAX_PK_SZ, - 8*1024, 64*1024, &aw->max_packet_size, lb_name, l)) { - *side_effect |= JK_STATUS_NEEDS_PUSH; - if (aw->max_packet_size > lb->max_packet_size) { - lb->max_packet_size = aw->max_packet_size; - } - } - return rc; -} - -static void commit_all_members(jk_ws_service_t *s, - status_endpoint_t *p, - jk_worker_t *jw, - const char *attribute, - jk_logger_t *l) -{ - const char *arg; - char vname[32]; - const char *name = NULL; - lb_worker_t *lb = NULL; - status_worker_t *w = p->worker; - const char *aname; - int i; - int rc = 0; - unsigned int j; - - JK_TRACE_ENTER(l); - if (!attribute) { - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' missing request parameter '%s'", - w->name, JK_STATUS_ARG_ATTRIBUTE); - JK_TRACE_EXIT(l); - return; - } - else { - if (!strcmp(attribute, JK_STATUS_ARG_LBM_ACTIVATION)) - aname=JK_STATUS_ARG_LBM_TEXT_ACTIVATION; - else if (!strcmp(attribute, JK_STATUS_ARG_LBM_FACTOR)) - aname=JK_STATUS_ARG_LBM_TEXT_FACTOR; - else if (!strcmp(attribute, JK_STATUS_ARG_LBM_ROUTE)) - aname=JK_STATUS_ARG_LBM_TEXT_ROUTE; - else if (!strcmp(attribute, JK_STATUS_ARG_LBM_REDIRECT)) - aname=JK_STATUS_ARG_LBM_TEXT_REDIRECT; - else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DOMAIN)) - aname=JK_STATUS_ARG_LBM_TEXT_DOMAIN; - else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DISTANCE)) - aname=JK_STATUS_ARG_LBM_TEXT_DISTANCE; - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CACHE_TO)) - aname=JK_STATUS_ARG_AJP_TEXT_CACHE_TO; - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_PING_TO)) - aname=JK_STATUS_ARG_AJP_TEXT_PING_TO; - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CONNECT_TO)) - aname=JK_STATUS_ARG_AJP_TEXT_CONNECT_TO; - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_PREPOST_TO)) - aname=JK_STATUS_ARG_AJP_TEXT_PREPOST_TO; - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_REPLY_TO)) - aname=JK_STATUS_ARG_AJP_TEXT_REPLY_TO; - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_RETRIES)) - aname=JK_STATUS_ARG_AJP_TEXT_RETRIES; - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_RETRY_INT)) - aname=JK_STATUS_ARG_AJP_TEXT_RETRY_INT; - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CPING_INT)) - aname=JK_STATUS_ARG_AJP_TEXT_CPING_INT; - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_REC_OPTS)) - aname=JK_STATUS_ARG_AJP_TEXT_REC_OPTS; - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_MAX_PK_SZ)) - aname=JK_STATUS_ARG_AJP_TEXT_MAX_PK_SZ; - else { - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' unknown attribute '%s'", - w->name, attribute); - JK_TRACE_EXIT(l); - return; - } - } - if (jw->type == JK_LB_WORKER_TYPE) { - lb = (lb_worker_t *)jw->worker_private; - name = lb->name; - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' committing changes for attribute '%s' [%s] of all members of lb worker '%s'", - w->name, attribute, aname, name); - } - else { - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' worker type not implemented", - w->name); - JK_TRACE_EXIT(l); - return; - } - - if (lb) { - for (j = 0; j < lb->num_of_workers; j++) { - int sync_needed = JK_FALSE; - lb_sub_worker_t *wr = &(lb->lb_workers[j]); - jk_worker_t *jw = wr->worker; - ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private;; - snprintf(vname, 32-1, "" JK_STATUS_ARG_MULT_VALUE_BASE "%d", j); - - if (!strcmp(attribute, JK_STATUS_ARG_LBM_FACTOR)) { - if (set_int_if_changed(p, wr->name, "lbfactor", vname, - 1, INT_MAX, &wr->lb_factor, name, l)) { - rc = 2; - sync_needed = JK_TRUE; - } - } - else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DISTANCE)) { - if (set_int_if_changed(p, wr->name, "distance", vname, - 0, INT_MAX, &wr->distance, name, l)) - sync_needed = JK_TRUE; - } - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CACHE_TO)) { - int old = aw->cache_timeout; - if (set_int_if_changed(p, aw->name, "connection_pool_timeout", vname, - 0, INT_MAX, &aw->cache_timeout, name, l)) { - sync_needed = JK_TRUE; - if (old == 0) { - unsigned int i; - for (i = 0; i < aw->ep_cache_sz; i++) { - ajp_endpoint_t *ae = (ajp_endpoint_t *) aw->ep_cache[i]; - if (ae) - ae->last_access = time(NULL); - } - } - } - } - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_PING_TO)) { - if (set_int_if_changed(p, aw->name, "ping_timeout", vname, - 0, INT_MAX, &aw->ping_timeout, name, l)) - sync_needed = JK_TRUE; - } - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CONNECT_TO)) { - if (set_int_if_changed(p, aw->name, "connect_timeout", vname, - 0, INT_MAX, &aw->connect_timeout, name, l)) - sync_needed = JK_TRUE; - } - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_PREPOST_TO)) { - if (set_int_if_changed(p, aw->name, "prepost_timeout", vname, - 0, INT_MAX, &aw->prepost_timeout, name, l)) - sync_needed = JK_TRUE; - } - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_REPLY_TO)) { - if (set_int_if_changed(p, aw->name, "reply_timeout", vname, - 0, INT_MAX, &aw->reply_timeout, name, l)) - sync_needed = JK_TRUE; - } - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_RETRIES)) { - if (set_int_if_changed(p, aw->name, "retries", vname, - 1, INT_MAX, &aw->retries, name, l)) - sync_needed = JK_TRUE; - } - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_RETRY_INT)) { - if (set_int_if_changed(p, aw->name, "retry_interval", vname, - 1, INT_MAX, &aw->retry_interval, name, l)) - sync_needed = JK_TRUE; - } - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CPING_INT)) { - if (set_int_if_changed(p, aw->name, "connection_ping_interval", vname, - 1, INT_MAX, &aw->conn_ping_interval, name, l)) - sync_needed = JK_TRUE; - } - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_REC_OPTS)) { - if (set_uint_if_changed(p, aw->name, "recovery_options", vname, - 0, INT_MAX, &aw->recovery_opts, name, l)) - sync_needed = JK_TRUE; - } - else if (!strcmp(attribute, JK_STATUS_ARG_AJP_MAX_PK_SZ)) { - if (set_uint_if_changed(p, aw->name, "max_packet_size", vname, - 8*1024, 64*1024, &aw->max_packet_size, name, l)) { - sync_needed = JK_TRUE; - if (aw->max_packet_size > lb->max_packet_size) { - lb->max_packet_size = aw->max_packet_size; - } - } - } - else { - int rv = status_get_string(p, vname, NULL, &arg, l); - if (!strcmp(attribute, JK_STATUS_ARG_LBM_ACTIVATION)) { - if (rv == JK_TRUE) { - i = jk_lb_get_activation_code(arg); - if (i != wr->activation && i >= 0 && i <= JK_LB_ACTIVATION_MAX) { - jk_log(l, JK_LOG_INFO, - "Status worker '%s' setting 'activation' for sub worker '%s' of lb worker '%s' to '%s'", - w->name, wr->name, name, jk_lb_get_activation(wr, l)); - wr->activation = i; - rc = 1; - sync_needed = JK_TRUE; - } - } - } - else if (!strcmp(attribute, JK_STATUS_ARG_LBM_ROUTE)) { - if (rv == JK_TRUE) { - if (strncmp(wr->route, arg, JK_SHM_STR_SIZ)) { - jk_log(l, JK_LOG_INFO, - "Status worker '%s' setting 'route' for sub worker '%s' of lb worker '%s' to '%s'", - w->name, wr->name, name, arg); - strncpy(wr->route, arg, JK_SHM_STR_SIZ); - sync_needed = JK_TRUE; - if (!wr->domain[0]) { - char * id_domain = strchr(wr->route, '.'); - if (id_domain) { - *id_domain = '\0'; - strcpy(wr->domain, wr->route); - *id_domain = '.'; - } - } - } - } - } - else if (!strcmp(attribute, JK_STATUS_ARG_LBM_REDIRECT)) { - if (rv == JK_TRUE) { - if (strncmp(wr->redirect, arg, JK_SHM_STR_SIZ)) { - jk_log(l, JK_LOG_INFO, - "Status worker '%s' setting 'redirect' for sub worker '%s' of lb worker '%s' to '%s'", - w->name, wr->name, name, arg); - strncpy(wr->redirect, arg, JK_SHM_STR_SIZ); - sync_needed = JK_TRUE; - } - } - } - else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DOMAIN)) { - if (rv == JK_TRUE) { - if (strncmp(wr->domain, arg, JK_SHM_STR_SIZ)) { - jk_log(l, JK_LOG_INFO, - "Status worker '%s' setting 'domain' for sub worker '%s' of lb worker '%s' to '%s'", - w->name, wr->name, name, arg); - strncpy(wr->domain, arg, JK_SHM_STR_SIZ); - sync_needed = JK_TRUE; - } - } - } - } - if (sync_needed == JK_TRUE) { - wr->sequence++; - if (!rc) - rc = 3; - } - } - if (rc == 1) - reset_lb_values(lb, l); - else if (rc == 2) - /* Recalculate the load multiplicators wrt. lb_factor */ - update_mult(lb, l); - if (rc) { - lb->sequence++; - jk_lb_push(lb, JK_TRUE, l); - } - } - JK_TRACE_EXIT(l); -} - -static void display_legend(jk_ws_service_t *s, - status_endpoint_t *p, - jk_logger_t *l) -{ - - int mime; - const char *arg; - unsigned int hide_legend; - - JK_TRACE_ENTER(l); - status_get_string(p, JK_STATUS_ARG_MIME, NULL, &arg, l); - mime = status_mime_int(arg); - if (mime != JK_STATUS_MIME_HTML) { - JK_TRACE_EXIT(l); - return; - } - hide_legend = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) & - JK_STATUS_ARG_OPTION_NO_LEGEND; - if (hide_legend) { - jk_puts(s, "

\n"); - status_write_uri(s, p, "Show Legend", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_LEGEND, NULL, l); - jk_puts(s, "

\n"); - } - else { - jk_puts(s, "

Legend ["); - status_write_uri(s, p, "Hide", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, JK_STATUS_ARG_OPTION_NO_LEGEND, 0, NULL, l); - jk_puts(s, "]

\n"); - - jk_puts(s, "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "
NameWorker name
TypeWorker type
RouteWorker route
ActWorker activation configuration
\n" - "ACT=Active, DIS=Disabled, STP=Stopped
StateWorker error status
\n" - "OK=OK, ERR=Error with substates
\n" - "IDLE=No requests handled, BUSY=All connections busy,
\n" - "REC=Recovering, PRB=Probing, FRC=Forced Recovery
DWorker distance
FLoad Balancer factor
MLoad Balancer multiplicity
VLoad Balancer value
AccNumber of requests
ErrNumber of failed requests
CENumber of client errors
RENumber of reply timeouts (decayed)
WrNumber of bytes transferred
RdNumber of bytes read
BusyCurrent number of busy connections
MaxMaximum number of busy connections
ConCurrent number of backend connections
RRRoute redirect
CdCluster domain
RsRecovery scheduled in app. min/max seconds
LRSeconds since last reset of statistics counters
LETimestamp of the last error
\n"); - } - - JK_TRACE_EXIT(l); -} - -static int check_worker(jk_ws_service_t *s, - status_endpoint_t *p, - jk_uint32_t allow_wildchars, - jk_logger_t *l) -{ - const char *worker; - const char *sub_worker; - status_worker_t *w = p->worker; - jk_worker_t *jw = NULL; - lb_sub_worker_t *wr = NULL; - - JK_TRACE_ENTER(l); - if (fetch_worker_and_sub_worker(p, "checking", &worker, &sub_worker, l) == JK_FALSE || - search_worker(s, p, &jw, worker, l) == JK_FALSE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (sub_worker && sub_worker[0]) { - unsigned int idx = 0; - unsigned int *wi = NULL; - if (strchr(sub_worker, '*') || strchr(sub_worker, '?')) { - /* We have a wildchar matching rule */ - if (!allow_wildchars) { - jk_log(l, JK_LOG_ERROR, - "Status worker '%s' wildcards in sub worker '%s' of worker '%s' not allowed for this command", - w->name, sub_worker, worker ? worker : "(null)"); - p->msg = "wildcard not allowed in sub worker for this command"; - JK_TRACE_EXIT(l); - return JK_FALSE; - } - else { - wi = &idx; - } - } - if (search_sub_worker(s, p, jw, worker, &wr, sub_worker, - wi, l) == JK_FALSE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -static void count_workers(jk_ws_service_t *s, - status_endpoint_t *p, - int *lb_cnt, int *ajp_cnt, - jk_logger_t *l) -{ - unsigned int i; - jk_worker_t *jw = NULL; - status_worker_t *w = p->worker; - - JK_TRACE_ENTER(l); - *lb_cnt = 0; - *ajp_cnt = 0; - for (i = 0; i < w->we->num_of_workers; i++) { - jw = wc_get_worker_for_name(w->we->worker_list[i], l); - if (!jw) { - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' could not find worker '%s'", - w->name, w->we->worker_list[i]); - continue; - } - if (jw->type == JK_LB_WORKER_TYPE) { - (*lb_cnt)++; - } - else if (jw->type == JK_AJP13_WORKER_TYPE || - jw->type == JK_AJP14_WORKER_TYPE) { - (*ajp_cnt)++; - } - } - JK_TRACE_EXIT(l); -} - -static void list_workers_type(jk_ws_service_t *s, - status_endpoint_t *p, - int list_lb, int count, - jk_logger_t *l) -{ - - const char *arg; - unsigned int i; - int mime; - unsigned int hide; - jk_worker_t *jw = NULL; - status_worker_t *w = p->worker; - - JK_TRACE_ENTER(l); - - status_get_string(p, JK_STATUS_ARG_MIME, NULL, &arg, l); - mime = status_mime_int(arg); - if (list_lb) { - hide = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) & - JK_STATUS_ARG_OPTION_NO_LB; - if (hide) { - if (mime == JK_STATUS_MIME_HTML) { - jk_puts(s, "

\n"); - status_write_uri(s, p, "Show Load Balancing Workers", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_LB, NULL, l); - jk_puts(s, "

\n"); - } - } - else { - if (mime == JK_STATUS_MIME_XML) { - jk_print_xml_start_elt(s, w, 0, 0, "balancers"); - jk_print_xml_att_int(s, 2, "count", count); - jk_print_xml_stop_elt(s, 0, 0); - } - else if (mime == JK_STATUS_MIME_TXT) { - jk_printf(s, "Balancer Workers: count=%d\n", count); - } - else if (mime == JK_STATUS_MIME_PROP) { - jk_print_prop_att_int(s, w, NULL, "lb_count", count); - } - else { - jk_printf(s, "

Listing Load Balancing Worker%s (%d Worker%s) [", - count>1 ? "s" : "", count, count>1 ? "s" : ""); - status_write_uri(s, p, "Hide", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, JK_STATUS_ARG_OPTION_NO_LB, 0, NULL, l); - jk_puts(s, "]

\n"); - } - } - } - else { - hide = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) & - JK_STATUS_ARG_OPTION_NO_AJP; - if (hide) { - if (mime == JK_STATUS_MIME_HTML) { - jk_puts(s, "

\n"); - status_write_uri(s, p, "Show AJP Workers", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_AJP, NULL, l); - jk_puts(s, "

\n"); - } - } - else { - if (mime == JK_STATUS_MIME_XML) { - jk_print_xml_start_elt(s, w, 0, 0, "ajp_workers"); - jk_print_xml_att_int(s, 2, "count", count); - jk_print_xml_stop_elt(s, 0, 0); - } - else if (mime == JK_STATUS_MIME_TXT) { - jk_printf(s, "AJP Workers: count=%d\n", count); - } - else if (mime == JK_STATUS_MIME_PROP) { - jk_print_prop_att_int(s, w, NULL, "ajp_count", count); - } - else { - jk_printf(s, "

Listing AJP Worker%s (%d Worker%s) [", - count>1 ? "s" : "", count, count>1 ? "s" : ""); - status_write_uri(s, p, "Hide", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, JK_STATUS_ARG_OPTION_NO_AJP, 0, NULL, l); - jk_puts(s, "]

\n"); - } - } - } - - if (hide) { - JK_TRACE_EXIT(l); - return; - } - - for (i = 0; i < w->we->num_of_workers; i++) { - jw = wc_get_worker_for_name(w->we->worker_list[i], l); - if (!jw) { - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' could not find worker '%s'", - w->name, w->we->worker_list[i]); - continue; - } - if ((list_lb && jw->type == JK_LB_WORKER_TYPE) || - (!list_lb && jw->type != JK_LB_WORKER_TYPE)) { - display_worker(s, p, jw, NULL, l); - } - } - - if (list_lb) { - if (mime == JK_STATUS_MIME_XML) { - jk_print_xml_close_elt(s, w, 0, "balancers"); - } - else if (mime == JK_STATUS_MIME_TXT) { - } - else if (mime == JK_STATUS_MIME_PROP) { - } - else if (mime == JK_STATUS_MIME_HTML) { - } - } - else { - if (mime == JK_STATUS_MIME_XML) { - jk_print_xml_close_elt(s, w, 0, "ajp_workers"); - } - else if (mime == JK_STATUS_MIME_TXT) { - } - else if (mime == JK_STATUS_MIME_PROP) { - } - else if (mime == JK_STATUS_MIME_HTML) { - } - } - - JK_TRACE_EXIT(l); -} - -static int list_workers(jk_ws_service_t *s, - status_endpoint_t *p, - jk_logger_t *l) -{ - int lb_cnt = 0; - int ajp_cnt = 0; - - JK_TRACE_ENTER(l); - count_workers(s, p, &lb_cnt, &ajp_cnt, l); - - if (lb_cnt) { - list_workers_type(s, p, 1, lb_cnt, l); - } - - if (ajp_cnt) { - list_workers_type(s, p, 0, ajp_cnt, l); - } - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -static int show_worker(jk_ws_service_t *s, - status_endpoint_t *p, - jk_logger_t *l) -{ - const char *worker; - const char *sub_worker; - jk_worker_t *jw = NULL; - lb_sub_worker_t *wr = NULL; - - JK_TRACE_ENTER(l); - if (fetch_worker_and_sub_worker(p, "showing", &worker, &sub_worker, l) == JK_FALSE || - search_worker(s, p, &jw, worker, l) == JK_FALSE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - if (sub_worker && sub_worker[0]) { - if (search_sub_worker(s, p, jw, worker, &wr, sub_worker, - NULL, l) == JK_FALSE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - display_worker(s, p, jw, wr, l); - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -static int edit_worker(jk_ws_service_t *s, - status_endpoint_t *p, - jk_logger_t *l) -{ - const char *worker; - const char *sub_worker; - status_worker_t *w = p->worker; - jk_worker_t *jw = NULL; - lb_worker_t *lb = NULL; - lb_sub_worker_t *wr = NULL; - ajp_worker_t *aw = NULL; - - JK_TRACE_ENTER(l); - if (fetch_worker_and_sub_worker(p, "editing", &worker, &sub_worker, l) == JK_FALSE || - search_worker(s, p, &jw, worker, l) == JK_FALSE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (jw->type == JK_LB_WORKER_TYPE) { - if (check_valid_lb(s, p, jw, worker, &lb, 0, l) == JK_FALSE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (lb->sequence != lb->s->h.sequence) - jk_lb_pull(lb, JK_FALSE, l); - if (!sub_worker || !sub_worker[0]) { - const char *arg; - if (status_get_string(p, JK_STATUS_ARG_ATTRIBUTE, - NULL, &arg, l) == JK_TRUE) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' %s lb worker '%s' with all sub workers", - w->name, "editing", lb->name); - form_all_members(s, p, jw, arg, l); - } - else { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' %s lb worker '%s'", - w->name, "editing", lb->name); - form_worker(s, p, jw, l); - } - JK_TRACE_EXIT(l); - return JK_TRUE; - } - else { - if (search_sub_worker(s, p, jw, worker, &wr, sub_worker, - NULL, l) == JK_FALSE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' %s lb worker '%s' sub worker '%s'", - w->name, "editing", lb->name, wr->name); - aw = (ajp_worker_t *)wr->worker->worker_private; - form_member(s, p, wr, aw, worker, l); - JK_TRACE_EXIT(l); - return JK_TRUE; - } - } - else if (jw->type == JK_AJP13_WORKER_TYPE || - jw->type == JK_AJP14_WORKER_TYPE) { - ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private; - if (aw) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' %s ajp worker '%s'", - w->name, "editing", aw->name); - if (aw->sequence != aw->s->h.sequence) - jk_ajp_pull(aw, JK_FALSE, l); - form_member(s, p, NULL, aw, worker, l); - JK_TRACE_EXIT(l); - return JK_TRUE; - } - else { - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' aw worker is (null)", - w->name); - } - } - else { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' worker type not implemented", - w->name); - } - JK_TRACE_EXIT(l); - return JK_FALSE; -} - -static int update_worker(jk_ws_service_t *s, - status_endpoint_t *p, - jk_logger_t *l) -{ - const char *worker; - const char *sub_worker; - status_worker_t *w = p->worker; - jk_worker_t *jw = NULL; - lb_worker_t *lb = NULL; - lb_sub_worker_t *wr = NULL; - ajp_worker_t *aw = NULL; - int rc = JK_TRUE; - int rv; - - JK_TRACE_ENTER(l); - if (fetch_worker_and_sub_worker(p, "updating", &worker, &sub_worker, l) == JK_FALSE || - search_worker(s, p, &jw, worker, l) == JK_FALSE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (jw->type == JK_LB_WORKER_TYPE) { - if (check_valid_lb(s, p, jw, worker, &lb, 0, l) == JK_FALSE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (lb->sequence != lb->s->h.sequence) - jk_lb_pull(lb, JK_TRUE, l); - if (!sub_worker || !sub_worker[0]) { - const char *arg; - if (status_get_string(p, JK_STATUS_ARG_ATTRIBUTE, - NULL, &arg, l) == JK_TRUE) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' %s lb worker '%s' with all sub workers", - w->name, "updating", lb->name); - commit_all_members(s, p, jw, arg, l); - } - else { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' %s lb worker '%s'", - w->name, "updating", lb->name); - commit_worker(s, p, jw, l); - } - JK_TRACE_EXIT(l); - return JK_TRUE; - } - else { - unsigned int idx = 0; - unsigned int *wi = NULL; - int is_wildchar = JK_FALSE; - - if (strchr(sub_worker, '*') || strchr(sub_worker, '?')) { - /* We have a wildchar matching rule */ - wi = &idx; - is_wildchar = JK_TRUE; - } - for (;;) { - if (search_sub_worker(s, p, jw, worker, &wr, sub_worker, - wi, l) == JK_FALSE) { - if (!idx) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - else { - /* We have found at least one match previously */ - p->msg = "OK"; - break; - } - } - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' %s lb worker '%s' sub worker '%s'", - w->name, "updating", lb->name, wr->name); - aw = (ajp_worker_t *)wr->worker->worker_private; - rv = 0; - rc = commit_member(s, p, lb, wr, aw, &rv, l); - if (rv & JK_STATUS_NEEDS_ADDR_PUSH) { - aw->addr_sequence++; - } - if (rv & (JK_STATUS_NEEDS_PUSH | JK_STATUS_NEEDS_ADDR_PUSH)) { - wr->sequence++; - lb->sequence++; - jk_lb_push(lb, JK_TRUE, l); - } - if (rv & JK_STATUS_NEEDS_RESET_LB_VALUES) - reset_lb_values(lb, l); - if (rv & JK_STATUS_NEEDS_UPDATE_MULT) - /* Recalculate the load multiplicators wrt. lb_factor */ - update_mult(lb, l); - if (rc == JK_FALSE) { - jk_log(l, JK_LOG_ERROR, - "Status worker '%s' failed updating sub worker '%s' (at least partially).%s", - w->name, aw->name, (is_wildchar == JK_TRUE) ? " Aborting further wildcard updates." : ""); - if (!strncmp("OK", p->msg, 3)) { - const char *msg = "Update failed (at least partially) for sub worker '%s'"; - size_t size = strlen(msg) + strlen(aw->name) + 1; - p->msg = jk_pool_alloc(s->pool, size); - snprintf(p->msg, size, msg, aw->name); - } - if (is_wildchar == JK_TRUE) { - const char *msg = " Aborting further wildcard updates."; - size_t size = strlen(msg) + strlen(p->msg) + 1; - p->msg = jk_pool_realloc(s->pool, size, p->msg, strlen(p->msg) + 1); - strcat(p->msg, msg); - } - break; - } - if (!wi) - break; - } - JK_TRACE_EXIT(l); - return rc; - } - } - else if (jw->type == JK_AJP13_WORKER_TYPE || - jw->type == JK_AJP14_WORKER_TYPE) { - ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private; - if (aw) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' %s ajp worker '%s'", - w->name, "updating", aw->name); - if (aw->sequence != aw->s->h.sequence) - jk_ajp_pull(aw, JK_TRUE, l); - rv = 0; - rc = commit_member(s, p, NULL, NULL, aw, &rv, l); - if (rv & JK_STATUS_NEEDS_ADDR_PUSH) { - aw->addr_sequence++; - } - if (rv & (JK_STATUS_NEEDS_PUSH | JK_STATUS_NEEDS_ADDR_PUSH)) { - aw->sequence++; - jk_ajp_push(aw, JK_TRUE, l); - } - if (rc == JK_FALSE) { - jk_log(l, JK_LOG_ERROR, - "Status worker '%s' failed updating worker '%s' (at least partially).", - w->name, aw->name); - if (!strncmp("OK", p->msg, 3)) { - const char *msg = "Update failed (at least partially) for worker '%s'"; - size_t size = strlen(msg) + strlen(aw->name) + 1; - p->msg = jk_pool_alloc(s->pool, size); - snprintf(p->msg, size, msg, aw->name); - } - } - JK_TRACE_EXIT(l); - return rc; - } - else { - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' aw worker is (null)", - w->name); - } - } - else { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' worker type not implemented", - w->name); - } - JK_TRACE_EXIT(l); - return JK_FALSE; -} - -static int reset_worker(jk_ws_service_t *s, - status_endpoint_t *p, - jk_logger_t *l) -{ - unsigned int i; - const char *worker; - const char *sub_worker; - status_worker_t *w = p->worker; - jk_worker_t *jw = NULL; - lb_worker_t *lb = NULL; - lb_sub_worker_t *wr = NULL; - ajp_worker_t *aw = NULL; - time_t now = 0; - - JK_TRACE_ENTER(l); - if (fetch_worker_and_sub_worker(p, "resetting", &worker, &sub_worker, l) == JK_FALSE || - search_worker(s, p, &jw, worker, l) == JK_FALSE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - now = time(NULL); - if (jw->type == JK_LB_WORKER_TYPE) { - if (check_valid_lb(s, p, jw, worker, &lb, 0, l) == JK_FALSE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (!sub_worker || !sub_worker[0]) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' %s lb worker '%s' with all sub workers", - w->name, "resetting", lb->name); - lb->s->max_busy = 0; - lb->s->last_reset = now; - for (i = 0; i < lb->num_of_workers; i++) { - wr = &(lb->lb_workers[i]); - aw = (ajp_worker_t *)wr->worker->worker_private; - wr->s->state = JK_LB_STATE_IDLE; - wr->s->elected_snapshot = 0; - wr->s->error_time = 0; - wr->s->errors = 0; - wr->s->lb_value = 0; - aw->s->used = 0; - aw->s->client_errors = 0; - aw->s->reply_timeouts = 0; - aw->s->transferred = 0; - aw->s->readed = 0; - aw->s->max_busy = 0; - aw->s->last_reset = now; - } - JK_TRACE_EXIT(l); - return JK_TRUE; - } - else { - if (search_sub_worker(s, p, jw, worker, &wr, sub_worker, - NULL, l) == JK_FALSE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' %s lb worker '%s' sub worker '%s'", - w->name, "resetting", lb->name, wr->name); - aw = (ajp_worker_t *)wr->worker->worker_private; - wr->s->state = JK_LB_STATE_IDLE; - wr->s->elected_snapshot = 0; - wr->s->error_time = 0; - wr->s->errors = 0; - wr->s->lb_value = 0; - aw->s->used = 0; - aw->s->client_errors = 0; - aw->s->reply_timeouts = 0; - aw->s->transferred = 0; - aw->s->readed = 0; - aw->s->max_busy = 0; - aw->s->last_reset = now; - JK_TRACE_EXIT(l); - return JK_TRUE; - } - } - else if (jw->type == JK_AJP13_WORKER_TYPE || - jw->type == JK_AJP14_WORKER_TYPE) { - ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private; - if (aw) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' %s ajp worker '%s'", - w->name, "resetting", aw->name); - aw->s->errors = 0; - aw->s->used = 0; - aw->s->client_errors = 0; - aw->s->reply_timeouts = 0; - aw->s->transferred = 0; - aw->s->readed = 0; - aw->s->max_busy = 0; - aw->s->last_reset = now; - JK_TRACE_EXIT(l); - return JK_TRUE; - } - else { - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' aw worker is (null)", - w->name); - } - } - else { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' worker type not implemented", - w->name); - } - JK_TRACE_EXIT(l); - return JK_FALSE; -} - -static int recover_worker(jk_ws_service_t *s, - status_endpoint_t *p, - jk_logger_t *l) -{ - const char *worker; - const char *sub_worker; - jk_worker_t *jw = NULL; - lb_sub_worker_t *wr = NULL; - ajp_worker_t *aw = NULL; - status_worker_t *w = p->worker; - - JK_TRACE_ENTER(l); - if (fetch_worker_and_sub_worker(p, "recovering", &worker, &sub_worker, l) == JK_FALSE || - search_worker(s, p, &jw, worker, l) == JK_FALSE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (search_sub_worker(s, p, jw, worker, &wr, sub_worker, - NULL, l) == JK_FALSE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - aw = (ajp_worker_t *)wr->worker->worker_private; - if (wr->s->state == JK_LB_STATE_ERROR) { - lb_worker_t *lb = NULL; - - /* We need an lb to correct the lb_value */ - if (check_valid_lb(s, p, jw, worker, &lb, 0, l) == JK_FALSE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (lb->lbmethod != JK_LB_METHOD_BUSYNESS) { - unsigned int i; - jk_uint64_t curmax = 0; - - for (i = 0; i < lb->num_of_workers; i++) { - if (lb->lb_workers[i].s->lb_value > curmax) { - curmax = lb->lb_workers[i].s->lb_value; - } - } - wr->s->lb_value = curmax; - } - - aw->s->reply_timeouts = 0; - wr->s->state = JK_LB_STATE_RECOVER; - jk_log(l, JK_LOG_INFO, - "Status worker '%s' marked worker '%s' sub worker '%s' for recovery", - w->name, worker ? worker : "(null)", sub_worker ? sub_worker : "(null)"); - JK_TRACE_EXIT(l); - return JK_TRUE; - } - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' could not mark worker '%s' sub worker '%s' for recovery - state %s is not an error state", - w->name, worker ? worker : "(null)", sub_worker ? sub_worker : "(null)", - jk_lb_get_state(wr, l)); - JK_TRACE_EXIT(l); - return JK_FALSE; -} - -static int dump_config(jk_ws_service_t *s, - status_endpoint_t *p, - int mime, jk_logger_t *l) -{ - status_worker_t *w = p->worker; - jk_worker_env_t *we = w->we; - jk_map_t *init_data = we->init_data; - - JK_TRACE_ENTER(l); - - if (init_data) { - int l = jk_map_size(init_data); - int i; - if (mime == JK_STATUS_MIME_HTML) { - jk_puts(s, "

Configuration Data


\n"); - jk_puts(s, "This dump does not include any changes applied by the status worker\n"); - jk_puts(s, "to the configuration after the initial startup\n"); - jk_puts(s, "
\n");
-        }
-        else if (mime == JK_STATUS_MIME_XML) {
-            jk_print_xml_start_elt(s, w, 2, 0, "configuration");
-        }
-        else if (mime == JK_STATUS_MIME_TXT) {
-            jk_puts(s, "Configuration:\n");
-        }
-        for (i=0;i sizeof(".secret") &&
-                    strcmp(name + nl - 7, ".secret") == 0) {
-                    continue;
-                }
-                value = jk_map_value_at(init_data, i);
-                if (!value)
-                    value = "(null)";
-                if (mime == JK_STATUS_MIME_HTML ||
-                    mime == JK_STATUS_MIME_PROP ||
-                    mime == JK_STATUS_MIME_TXT) {
-                    jk_putv(s, name, "=", value, "\n", NULL);
-                }
-                else if (mime == JK_STATUS_MIME_XML) {
-                     jk_print_xml_att_string(s, 4, name, value);
-                }
-            }
-        }
-        if (mime == JK_STATUS_MIME_HTML) {
-            jk_puts(s, "
\n"); - } - else if (mime == JK_STATUS_MIME_XML) { - jk_print_xml_stop_elt(s, 2, 1); - } - } - else { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -/* - * Return values of service() method for status worker: - * return value is_error reason - * JK_FALSE JK_HTTP_SERVER_ERROR Invalid parameters (null values) - * JK_TRUE JK_HTTP_OK All other cases - */ -static int JK_METHOD service(jk_endpoint_t *e, - jk_ws_service_t *s, - jk_logger_t *l, int *is_error) -{ - int cmd; - jk_uint32_t cmd_props; - int mime; - int refresh; - int read_only = 0; - const char *arg; - char *err = NULL; - status_endpoint_t *p; - status_worker_t *w; - int denied = 0; - - JK_TRACE_ENTER(l); - - if (!e || !e->endpoint_private || !s || !is_error) { - JK_LOG_NULL_PARAMS(l); - if (is_error) - *is_error = JK_HTTP_SERVER_ERROR; - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - p = e->endpoint_private; - w = p->worker; - - /* Set returned error to OK */ - *is_error = JK_HTTP_OK; - - if (w->num_of_users) { - if (s->remote_user) { - unsigned int i; - denied = 1; - for (i = 0; i < w->num_of_users; i++) { - if (w->user_case_insensitive) { - if (!strcasecmp(s->remote_user, w->user_names[i])) { - denied = 0; - break; - } - } - else { - if (!strcmp(s->remote_user, w->user_names[i])) { - denied = 0; - break; - } - } - } - } - else { - denied = 2; - } - } - - /* Step 1: Process GET params and update configuration */ - if (status_parse_uri(s, p, l) != JK_TRUE) { - err = "Error during parsing of URI"; - } - status_get_string(p, JK_STATUS_ARG_CMD, NULL, &arg, l); - cmd = status_cmd_int(arg); - cmd_props = status_cmd_props(cmd); - status_get_string(p, JK_STATUS_ARG_MIME, NULL, &arg, l); - mime = status_mime_int(arg); - refresh = status_get_int(p, JK_STATUS_ARG_REFRESH, 0, l); - if (w->read_only) { - read_only = 1; - } - else { - read_only = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) & - JK_STATUS_ARG_OPTION_READ_ONLY; - } - - if (mime == JK_STATUS_MIME_HTML) { - s->start_response(s, 200, "OK", headers_names, headers_vhtml, 3); - jk_puts(s, JK_STATUS_HEAD); - } - else if (mime == JK_STATUS_MIME_XML) { - s->start_response(s, 200, "OK", headers_names, headers_vxml, 3); - jk_puts(s, JK_STATUS_XMLH); - if (w->doctype) { - jk_putv(s, w->doctype, "\n", NULL); - } - jk_print_xml_start_elt(s, w, 0, 0, "status"); - if (w->xmlns && strlen(w->xmlns)) - jk_putv(s, " ", w->xmlns, NULL); - jk_print_xml_stop_elt(s, 0, 0); - } - else { - s->start_response(s, 200, "OK", headers_names, headers_vtxt, 3); - } - - if (denied == 0) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' service allowed for user '%s' [%s] from %s [%s]", - w->name, - s->remote_user ? s->remote_user : "(null)", - s->auth_type ? s->auth_type : "(null)", - s->remote_addr ? s->remote_addr : "(null)", - s->remote_host ? s->remote_host : "(null)"); - } - else if (denied == 1) { - err = "Access denied."; - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' service denied for user '%s' [%s] from %s [%s]", - w->name, - s->remote_user ? s->remote_user : "(null)", - s->auth_type ? s->auth_type : "(null)", - s->remote_addr ? s->remote_addr : "(null)", - s->remote_host ? s->remote_host : "(null)"); - } - else if (denied == 2) { - err = "Access denied."; - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' service denied (no user) [%s] from %s [%s]", - w->name, - s->remote_user ? s->remote_user : "(null)", - s->auth_type ? s->auth_type : "(null)", - s->remote_addr ? s->remote_addr : "(null)", - s->remote_host ? s->remote_host : "(null)"); - } - else { - err = "Access denied."; - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' service denied (unknown reason) for user '%s' [%s] from %s [%s]", - w->name, - s->remote_user ? s->remote_user : "(null)", - s->auth_type ? s->auth_type : "(null)", - s->remote_addr ? s->remote_addr : "(null)", - s->remote_host ? s->remote_host : "(null)"); - } - - if (!err) { - if (read_only && !(cmd_props & JK_STATUS_CMD_PROP_READONLY)) { - err = "This command is not allowed in read only mode."; - } - } - - if (!err) { - if (cmd == JK_STATUS_CMD_UNKNOWN) { - err = "Invalid command."; - } - else if (mime == JK_STATUS_MIME_UNKNOWN) { - err = "Invalid mime type."; - } - else if (cmd_props & JK_STATUS_CMD_PROP_CHECK_WORKER && - (check_worker(s, p, cmd_props & JK_STATUS_CMD_PROP_WILDCARD, l) != JK_TRUE)) { - err = p->msg; - } - } - - if (!err) { - char buf_time[JK_STATUS_TIME_BUF_SZ]; - char buf_tz[JK_STATUS_TIME_BUF_SZ]; - time_t clock = time(NULL); - long unix_seconds = (long)clock; - int rc_time = status_strftime(clock, mime, buf_time, buf_tz, l); - if (cmd == JK_STATUS_CMD_UPDATE) { - /* lock shared memory */ - jk_shm_lock(); - if (update_worker(s, p, l) == JK_FALSE) { - if (strncmp("OK", p->msg, 3)) - err = p->msg; - else - err = "Update failed"; - } - /* unlock the shared memory */ - jk_shm_unlock(); - if (mime == JK_STATUS_MIME_HTML) { - write_html_refresh_response(s, p, err, l); - } - } - else if (cmd == JK_STATUS_CMD_RESET) { - /* lock shared memory */ - jk_shm_lock(); - if (reset_worker(s, p, l) == JK_FALSE) { - err = "Reset failed"; - } - /* unlock the shared memory */ - jk_shm_unlock(); - if (mime == JK_STATUS_MIME_HTML) { - write_html_refresh_response(s, p, err, l); - } - } - else if (cmd == JK_STATUS_CMD_RECOVER) { - /* lock shared memory */ - jk_shm_lock(); - if (recover_worker(s, p, l) == JK_FALSE) { - err = "Marking worker for recovery failed"; - } - /* unlock the shared memory */ - jk_shm_unlock(); - if (mime == JK_STATUS_MIME_HTML) { - write_html_refresh_response(s, p, err, l); - } - } - else { - if (mime == JK_STATUS_MIME_XML) { - jk_print_xml_start_elt(s, w, 0, 0, "server"); - jk_print_xml_att_string(s, 2, "name", s->server_name); - jk_print_xml_att_int(s, 2, "port", s->server_port); - jk_print_xml_stop_elt(s, 0, 1); - if (cmd_props & JK_STATUS_CMD_PROP_HEAD) { - if (rc_time > 0 ) { - jk_print_xml_start_elt(s, w, 0, 0, "time"); - jk_print_xml_att_string(s, 2, "datetime", buf_time); - jk_print_xml_att_string(s, 2, "tz", buf_tz); - jk_print_xml_att_long(s, 2, "unix", unix_seconds); - jk_print_xml_stop_elt(s, 0, 1); - } - jk_print_xml_start_elt(s, w, 0, 0, "software"); - jk_print_xml_att_string(s, 2, "web_server", s->server_software); - jk_print_xml_att_string(s, 2, "jk_version", JK_FULL_EXPOSED_VERSION); - jk_print_xml_stop_elt(s, 0, 1); - } - if (cmd == JK_STATUS_CMD_LIST) { - /* Step 2: Display configuration */ - if (list_workers(s, p, l) != JK_TRUE) { - err = "Error in listing the workers."; - } - } - else if (cmd == JK_STATUS_CMD_SHOW) { - /* Step 2: Display detailed configuration */ - if (show_worker(s, p, l) != JK_TRUE) { - err = "Error in showing this worker."; - } - } - } - else if (mime == JK_STATUS_MIME_TXT) { - jk_puts(s, "Server:"); - jk_printf(s, " name=%s", s->server_name); - jk_printf(s, " port=%d", s->server_port); - jk_puts(s, "\n"); - if (cmd_props & JK_STATUS_CMD_PROP_HEAD) { - if (rc_time > 0) { - jk_puts(s, "Time:"); - jk_printf(s, " datetime=%s", buf_time); - jk_printf(s, " tz=%s", buf_tz); - jk_printf(s, " unix=%ld", unix_seconds); - jk_puts(s, "\n"); - } - jk_puts(s, "Software:"); - jk_printf(s, " web_server=\"%s\"", s->server_software); - jk_printf(s, " jk_version=%s", JK_FULL_EXPOSED_VERSION); - jk_puts(s, "\n"); - } - if (cmd == JK_STATUS_CMD_LIST) { - /* Step 2: Display configuration */ - if (list_workers(s, p, l) != JK_TRUE) { - err = "Error in listing the workers."; - } - } - else if (cmd == JK_STATUS_CMD_SHOW) { - /* Step 2: Display detailed configuration */ - if (show_worker(s, p, l) != JK_TRUE) { - err = "Error in showing this worker."; - } - } - } - else if (mime == JK_STATUS_MIME_PROP) { - jk_print_prop_att_string(s, w, NULL, "server_name", s->server_name); - jk_print_prop_att_int(s, w, NULL, "server_port", s->server_port); - if (cmd_props & JK_STATUS_CMD_PROP_HEAD) { - if (rc_time > 0) { - jk_print_prop_att_string(s, w, NULL, "time_datetime", buf_time); - jk_print_prop_att_string(s, w, NULL, "time_tz", buf_tz); - jk_print_prop_att_long(s, w, NULL, "time_unix", unix_seconds); - } - jk_print_prop_att_string(s, w, NULL, "web_server", s->server_software); - jk_print_prop_att_string(s, w, NULL, "jk_version", JK_FULL_EXPOSED_VERSION); - } - if (cmd == JK_STATUS_CMD_LIST) { - /* Step 2: Display configuration */ - if (list_workers(s, p, l) != JK_TRUE) { - err = "Error in listing the workers."; - } - } - else if (cmd == JK_STATUS_CMD_SHOW) { - /* Step 2: Display detailed configuration */ - if (show_worker(s, p, l) != JK_TRUE) { - err = "Error in showing this worker."; - } - } - } - else if (mime == JK_STATUS_MIME_HTML) { - if (cmd_props & JK_STATUS_CMD_PROP_REFRESH && - refresh > 0) { - jk_printf(s, "\n", - refresh, s->req_uri, p->query_string); - } - if (w->css) { - jk_putv(s, "\ncss, "\" />\n", NULL); - } - jk_puts(s, JK_STATUS_HEND); - jk_puts(s, "

JK Status Manager for "); - jk_puts(s, s->server_name); - jk_printf(s, ":%d", s->server_port); - if (read_only) { - jk_puts(s, " (read only)"); - } - jk_puts(s, "

\n\n"); - if (cmd_props & JK_STATUS_CMD_PROP_HEAD) { - jk_putv(s, "\n"); - jk_putv(s, "
Server Version:", - s->server_software, "   ", NULL); - if (rc_time > 0) { - jk_putv(s, "Server Time:", buf_time, NULL); - } - jk_puts(s, "
JK Version:", - JK_FULL_EXPOSED_VERSION, "", NULL); - jk_printf(s, "Unix Seconds:%d", unix_seconds); - jk_puts(s, "
\n
\n"); - } - jk_puts(s, "\n"); - if (cmd_props & JK_STATUS_CMD_PROP_REFRESH) { - jk_puts(s, "\n"); - } - if (cmd_props & JK_STATUS_CMD_PROP_FMT) { - jk_puts(s, "\n"); - } - jk_puts(s, "
"); - if (refresh > 0) { - const char *str = p->query_string; - char *buf = jk_pool_alloc(s->pool, sizeof(char *) * (strlen(str)+1)); - int result = 0; - size_t scan = 0; - size_t len = strlen(JK_STATUS_ARG_REFRESH); - - while (str[scan] != '\0') { - if (strncmp(&str[scan], JK_STATUS_ARG_REFRESH, len) == 0 && - str[scan+len] == '=') { - scan += len + 1; - while (str[scan] != '\0' && str[scan] != '&') - scan++; - if (str[scan] == '&') - scan++; - } - else { - if (result > 0 && str[scan] != '\0' && str[scan] != '&') { - buf[result] = '&'; - result++; - } - while (str[scan] != '\0' && str[scan] != '&') { - buf[result] = str[scan]; - result++; - scan++; - } - if (str[scan] == '&') - scan++; - } - } - buf[result] = '\0'; - - jk_putv(s, "[req_uri, NULL); - if (buf && buf[0]) - jk_putv(s, "?", buf, NULL); - jk_puts(s, "\">Stop auto refresh]"); - } - else { - status_start_form(s, p, "get", JK_STATUS_CMD_UNKNOWN, JK_STATUS_ARG_REFRESH, l); - jk_puts(s, "\n"); - jk_putv(s, "(every ", - " ", - "seconds)", NULL); - jk_puts(s, "\n"); - } - jk_puts(s, "  |  \n"); - status_start_form(s, p, "get", JK_STATUS_CMD_UNKNOWN, JK_STATUS_ARG_MIME, l); - jk_puts(s, "\n"); - jk_putv(s, "\n"); - jk_puts(s, "
\n"); - jk_puts(s, "\n"); - if (cmd_props & JK_STATUS_CMD_PROP_BACK_LINK) { - int from; - jk_puts(s, "\n"); - } - if (cmd_props & JK_STATUS_CMD_PROP_SWITCH_RO) { - jk_puts(s, "\n"); - } - if (cmd_props & JK_STATUS_CMD_PROP_DUMP_LINK) { - jk_puts(s, "\n"); - } - if (cmd_props & JK_STATUS_CMD_PROP_LINK_HELP && - (cmd == JK_STATUS_CMD_LIST || !read_only)) { - jk_puts(s, "\n"); - } - jk_puts(s, "
\n"); - status_get_string(p, JK_STATUS_ARG_FROM, NULL, &arg, l); - from = status_cmd_int(arg); - jk_puts(s, "["); - if (cmd_props & JK_STATUS_CMD_PROP_BACK_LIST || - from == JK_STATUS_CMD_LIST) { - status_write_uri(s, p, "Back to worker list", JK_STATUS_CMD_LIST, JK_STATUS_MIME_UNKNOWN, - "", "", 0, 0, "", l); - } - else { - status_write_uri(s, p, "Back to worker view", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, 0, 0, "", l); - } - jk_puts(s, "]  "); - jk_puts(s, "\n"); - if (!w->read_only) { - jk_puts(s, "["); - if (read_only) { - status_write_uri(s, p, "Read/Write", 0, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, 0, JK_STATUS_ARG_OPTION_READ_ONLY, NULL, l); - } - else { - status_write_uri(s, p, "Read Only", 0, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, JK_STATUS_ARG_OPTION_READ_ONLY, 0, NULL, l); - } - jk_puts(s, "]  \n"); - } - jk_puts(s, "\n"); - jk_puts(s, "["); - status_write_uri(s, p, "Dump", JK_STATUS_CMD_DUMP, JK_STATUS_MIME_UNKNOWN, - NULL, NULL, 0, 0, NULL, l); - jk_puts(s, "]  \n"); - jk_puts(s, "\n"); - jk_puts(s, "["); - if (cmd == JK_STATUS_CMD_LIST) { - jk_puts(s, "S=Show only this worker, "); - } - jk_puts(s, "E=Edit worker, R=Reset worker state, T=Try worker recovery"); - jk_puts(s, "]
\n"); - jk_puts(s, "
\n"); - if (cmd == JK_STATUS_CMD_LIST) { - /* Step 2: Display configuration */ - if (list_workers(s, p, l) != JK_TRUE) { - err = "Error in listing the workers."; - } - } - else if (cmd == JK_STATUS_CMD_SHOW) { - /* Step 2: Display detailed configuration */ - if (show_worker(s, p, l) != JK_TRUE) { - err = "Error in showing this worker."; - } - } - else if (cmd == JK_STATUS_CMD_EDIT) { - /* Step 2: Display edit form */ - if (edit_worker(s, p, l) != JK_TRUE) { - err = "Error in generating this worker's configuration form."; - } - } - } - if (cmd == JK_STATUS_CMD_DUMP) { - if (dump_config(s, p, mime, l) == JK_FALSE) { - err = "Dumping configuration failed"; - } - } - if (cmd_props & JK_STATUS_CMD_PROP_LEGEND) { - display_legend(s, p, l); - } - } - } - if (err) { - jk_log(l, JK_LOG_WARNING, "Status worker '%s': %s", w->name, err); - if (mime == JK_STATUS_MIME_HTML) { - jk_putv(s, "

Result: ERROR - ", err, "
", NULL); - jk_putv(s, "req_uri, "\">JK Status Manager Start Page

", NULL); - } - else if (mime == JK_STATUS_MIME_XML) { - jk_print_xml_start_elt(s, w, 2, 0, "result"); - jk_print_xml_att_string(s, 4, "type", "ERROR"); - jk_print_xml_att_string(s, 4, "message", err); - jk_print_xml_stop_elt(s, 2, 1); - } - else if (mime == JK_STATUS_MIME_TXT) { - jk_puts(s, "Result:"); - jk_printf(s, " type=%s", "ERROR"); - jk_printf(s, " message=\"%s\"", err); - jk_puts(s, "\n"); - } - else { - jk_print_prop_att_string(s, w, "result", "type", "ERROR"); - jk_print_prop_att_string(s, w, "result", "message", err); - } - } - else { - if (mime == JK_STATUS_MIME_HTML) { - jk_putv(s, "

req_uri, "\">JK Status Manager Start Page

", NULL); - } - else if (mime == JK_STATUS_MIME_XML) { - jk_print_xml_start_elt(s, w, 2, 0, "result"); - jk_print_xml_att_string(s, 4, "type", "OK"); - jk_print_xml_att_string(s, 4, "message", "Action finished"); - jk_print_xml_stop_elt(s, 2, 1); - } - else if (mime == JK_STATUS_MIME_TXT) { - jk_puts(s, "Result:"); - jk_printf(s, " type=%s", "OK"); - jk_printf(s, " message=\"%s\"", "Action finished"); - jk_puts(s, "\n"); - } - else { - jk_print_prop_att_string(s, w, "result", "type", "OK"); - jk_print_prop_att_string(s, w, "result", "message", "Action finished"); - } - } - if (mime == JK_STATUS_MIME_HTML) { - if (w->css) { - jk_putv(s, "
", JK_STATUS_COPYRIGHT, - "
\n", NULL); - } - else { - jk_putv(s, "

", JK_STATUS_COPYRIGHT, - "

\n", NULL); - } - jk_puts(s, JK_STATUS_BEND); - } - else if (mime == JK_STATUS_MIME_XML) { - jk_print_xml_close_elt(s, w, 0, "status"); - } - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -static int JK_METHOD done(jk_endpoint_t **e, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - - if (e && *e && (*e)->endpoint_private) { - status_endpoint_t *p = (*e)->endpoint_private; - - jk_map_free(&(p->req_params)); - free(p); - *e = NULL; - JK_TRACE_EXIT(l); - return JK_TRUE; - } - - JK_LOG_NULL_PARAMS(l); - JK_TRACE_EXIT(l); - return JK_FALSE; -} - -static int JK_METHOD validate(jk_worker_t *pThis, - jk_map_t *props, - jk_worker_env_t *we, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - - if (pThis && pThis->worker_private) { - JK_TRACE_EXIT(l); - return JK_TRUE; - } - - JK_LOG_NULL_PARAMS(l); - JK_TRACE_EXIT(l); - return JK_FALSE; -} - -static int JK_METHOD init(jk_worker_t *pThis, - jk_map_t *props, - jk_worker_env_t *we, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - if (pThis && pThis->worker_private) { - status_worker_t *p = pThis->worker_private; - char **good_rating; - unsigned int num_of_good; - char **bad_rating; - unsigned int num_of_bad; - unsigned int i; - p->we = we; - p->css = jk_get_worker_style_sheet(props, p->name, NULL); - p->prefix = jk_get_worker_prop_prefix(props, p->name, JK_STATUS_PREFIX_DEF); - p->ns = jk_get_worker_name_space(props, p->name, JK_STATUS_NS_DEF); - p->xmlns = jk_get_worker_xmlns(props, p->name, JK_STATUS_XMLNS_DEF); - p->doctype = jk_get_worker_xml_doctype(props, p->name, NULL); - p->read_only = jk_get_is_read_only(props, p->name); - p->user_case_insensitive = jk_get_worker_user_case_insensitive(props, p->name); - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' is %s and has css '%s', prefix '%s', name space '%s', xml name space '%s', document type '%s'", - p->name, - p->read_only ? "read-only" : "read/write", - p->css ? p->css : "(null)", - p->prefix ? p->prefix : "(null)", - p->ns ? p->ns : "(null)", - p->xmlns ? p->xmlns : "(null)", - p->doctype ? p->doctype : "(null)"); - if (jk_get_worker_user_list(props, p->name, - &(p->user_names), - &(p->num_of_users)) && p->num_of_users) { - for (i = 0; i < p->num_of_users; i++) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' restricting access to user '%s' case %s", - p->name, p->user_names[i], - p->user_case_insensitive ? "insensitive" : "sensitive"); - } - } - if (jk_get_worker_good_rating(props, p->name, - &good_rating, - &num_of_good) && num_of_good) { - p->good_mask = 0; - for (i = 0; i < num_of_good; i++) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' rating as good: '%s'", - p->name, good_rating[i]); - p->good_mask |= status_get_rating(good_rating[i], l); - } - } - else { - p->good_mask = JK_STATUS_MASK_GOOD_DEF; - } - if (jk_get_worker_bad_rating(props, p->name, - &bad_rating, - &num_of_bad) && num_of_bad) { - p->bad_mask = 0; - for (i = 0; i < num_of_bad; i++) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' rating as bad: '%s'", - p->name, bad_rating[i]); - p->bad_mask |= status_get_rating(bad_rating[i], l); - } - } - else { - p->bad_mask = JK_STATUS_MASK_BAD_DEF; - } - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Status worker '%s' has good rating for '%08" JK_UINT32_T_HEX_FMT - "' and bad rating for '%08" JK_UINT32_T_HEX_FMT "'", - p->name, - p->good_mask, - p->bad_mask); - if (p->good_mask & p->bad_mask) - jk_log(l, JK_LOG_WARNING, - "Status worker '%s' has non empty intersection '%08" JK_UINT32_T_HEX_FMT - "' between good rating for '%08" JK_UINT32_T_HEX_FMT - "' and bad rating for '%08" JK_UINT32_T_HEX_FMT "'", - p->name, - p->good_mask & p->bad_mask, - p->good_mask, - p->bad_mask); - } - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -static int JK_METHOD get_endpoint(jk_worker_t *pThis, - jk_endpoint_t **pend, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - - if (pThis && pThis->worker_private && pend) { - status_endpoint_t *p = (status_endpoint_t *) malloc(sizeof(status_endpoint_t)); - p->worker = pThis->worker_private; - p->endpoint.endpoint_private = p; - p->endpoint.service = service; - p->endpoint.done = done; - p->req_params = NULL; - p->msg = NULL; - *pend = &p->endpoint; - - JK_TRACE_EXIT(l); - return JK_TRUE; - } - else { - JK_LOG_NULL_PARAMS(l); - } - - JK_TRACE_EXIT(l); - return JK_FALSE; -} - -static int JK_METHOD destroy(jk_worker_t **pThis, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - - if (pThis && *pThis && (*pThis)->worker_private) { - status_worker_t *private_data = (*pThis)->worker_private; - - jk_close_pool(&private_data->p); - free(private_data); - - JK_TRACE_EXIT(l); - return JK_TRUE; - } - - JK_LOG_NULL_PARAMS(l); - JK_TRACE_EXIT(l); - return JK_FALSE; -} - -int JK_METHOD status_worker_factory(jk_worker_t **w, - const char *name, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - - if (NULL != name && NULL != w) { - status_worker_t *private_data = - (status_worker_t *) calloc(1, sizeof(status_worker_t)); - - jk_open_pool(&private_data->p, - private_data->buf, - sizeof(jk_pool_atom_t) * TINY_POOL_SIZE); - - private_data->name = name; - - private_data->worker.worker_private = private_data; - private_data->worker.validate = validate; - private_data->worker.init = init; - private_data->worker.get_endpoint = get_endpoint; - private_data->worker.destroy = destroy; - - *w = &private_data->worker; - JK_TRACE_EXIT(l); - return JK_STATUS_WORKER_TYPE; - } - else { - JK_LOG_NULL_PARAMS(l); - } - - JK_TRACE_EXIT(l); - return 0; -} diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.h deleted file mode 100644 index 59eb1260..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.h +++ /dev/null @@ -1,44 +0,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. - */ - -/*************************************************************************** - * Description: Status worker header file * - * Author: Mladen Turk * - * Version: $Revision: 466585 $ * - ***************************************************************************/ - -#ifndef JK_STATUS_H -#define JK_STATUS_H - -#include "jk_logger.h" -#include "jk_service.h" - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -#define JK_STATUS_WORKER_NAME ("status") -#define JK_STATUS_WORKER_TYPE (6) - -int JK_METHOD status_worker_factory(jk_worker_t **w, - const char *name, jk_logger_t *l); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* JK_STATUS_H */ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.lo deleted file mode 100644 index 0185386d..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.lo +++ /dev/null @@ -1,12 +0,0 @@ -# jk_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/jk_status.o' - -# Name of the non-PIC object. -non_pic_object='jk_status.o' - diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.o deleted file mode 100644 index 3db458bf..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_types.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_types.h deleted file mode 100644 index e8029377..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_types.h +++ /dev/null @@ -1,69 +0,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. - */ - -/*************************************************************************** - * Description: Platform specific, auto-detected types. * - * Author: Rainer Jung * - * Version: $Revision: 915199 $ * - ***************************************************************************/ - -#ifndef JK_TYPES_H -#define JK_TYPES_H - -/* GENERATED FILE WARNING! DO NOT EDIT jk_types.h - * - * You must modify jk_types.h.in instead. - * - */ - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -/* jk_uint32_t defines a four byte word */ -typedef unsigned int jk_uint32_t; - -/* And JK_UINT32_T_FMT */ -#define JK_UINT32_T_FMT "u" - -/* And JK_UINT32_T_HEX_FMT */ -#define JK_UINT32_T_HEX_FMT "x" - -/* jk_uint64_t defines a eight byte word */ -typedef unsigned long jk_uint64_t; - -/* And JK_UINT64_T_FMT */ -#define JK_UINT64_T_FMT "lu" - -/* And JK_UINT64_T_HEX_FMT */ -#define JK_UINT64_T_HEX_FMT "lx" - -/* And JK_PID_T_FMT */ -#define JK_PID_T_FMT "d" - -/* jk_pthread_t defines a eight byte word */ -typedef unsigned long jk_pthread_t; - -/* And JK_PTHREAD_T_FMT */ -#define JK_PTHREAD_T_FMT "lu" - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* JK_TYPES_H */ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_types.h.in b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_types.h.in deleted file mode 100644 index 6301b240..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_types.h.in +++ /dev/null @@ -1,69 +0,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. - */ - -/*************************************************************************** - * Description: Platform specific, auto-detected types. * - * Author: Rainer Jung * - * Version: $Revision: 915199 $ * - ***************************************************************************/ - -#ifndef JK_TYPES_H -#define JK_TYPES_H - -/* GENERATED FILE WARNING! DO NOT EDIT jk_types.h - * - * You must modify jk_types.h.in instead. - * - */ - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -/* jk_uint32_t defines a four byte word */ -typedef unsigned @int32_value@ jk_uint32_t; - -/* And JK_UINT32_T_FMT */ -@uint32_t_fmt@ - -/* And JK_UINT32_T_HEX_FMT */ -@uint32_t_hex_fmt@ - -/* jk_uint64_t defines a eight byte word */ -typedef unsigned @int64_value@ jk_uint64_t; - -/* And JK_UINT64_T_FMT */ -@uint64_t_fmt@ - -/* And JK_UINT64_T_HEX_FMT */ -@uint64_t_hex_fmt@ - -/* And JK_PID_T_FMT */ -@pid_t_fmt@ - -/* jk_pthread_t defines a eight byte word */ -typedef unsigned @pthread_t_value@ jk_pthread_t; - -/* And JK_PTHREAD_T_FMT */ -@pthread_t_fmt@ - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* JK_TYPES_H */ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.c deleted file mode 100644 index d652f769..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.c +++ /dev/null @@ -1,1191 +0,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. - */ - -/*************************************************************************** - * Description: URI to worker map object. * - * * - * Author: Gal Shachor * - * Author: Mladen Turk * - * Version: $Revision: 890739 $ * - ***************************************************************************/ - -#include "jk_pool.h" -#include "jk_util.h" -#include "jk_map.h" -#include "jk_mt.h" -#include "jk_uri_worker_map.h" -#include "jk_worker.h" -#include "jk_lb_worker.h" - -#ifdef WIN32 -#define JK_STRCMP strcasecmp -#define JK_STRNCMP strnicmp -#else -#define JK_STRCMP strcmp -#define JK_STRNCMP strncmp -#endif - -#define JK_UWMAP_EXTENSION_REPLY_TIMEOUT "reply_timeout=" -#define JK_UWMAP_EXTENSION_ACTIVE "active=" -#define JK_UWMAP_EXTENSION_DISABLED "disabled=" -#define JK_UWMAP_EXTENSION_STOPPED "stopped=" -#define JK_UWMAP_EXTENSION_FAIL_ON_STATUS "fail_on_status=" -#define JK_UWMAP_EXTENSION_USE_SRV_ERRORS "use_server_errors=" - -#define IND_SWITCH(x) (((x)+1) % 2) -#define IND_THIS(x) ((x)[uw_map->index]) -#define IND_NEXT(x) ((x)[IND_SWITCH(uw_map->index)]) - -#define STRNULL_FOR_NULL(x) ((x) ? (x) : "(null)") - -static const char *uri_worker_map_source_type[] = { - "unknown", - SOURCE_TYPE_TEXT_WORKERDEF, - SOURCE_TYPE_TEXT_JKMOUNT, - SOURCE_TYPE_TEXT_URIMAP, - SOURCE_TYPE_TEXT_DISCOVER, - NULL -}; - - -/* Return the string representation of the uwr source */ -const char *uri_worker_map_get_source(uri_worker_record_t *uwr, jk_logger_t *l) -{ - return uri_worker_map_source_type[uwr->source_type]; -} - -/* Return the string representation of the uwr match type */ -char *uri_worker_map_get_match(uri_worker_record_t *uwr, char *buf, jk_logger_t *l) -{ - unsigned int match; - - buf[0] = '\0'; - match = uwr->match_type; - - if (match & MATCH_TYPE_DISABLED) - strcat(buf, "Disabled "); -/* deprecated - if (match & MATCH_TYPE_STOPPED) - strcat(buf, "Stopped "); - */ - if (match & MATCH_TYPE_NO_MATCH) - strcat(buf, "Unmount "); - if (match & MATCH_TYPE_EXACT) - strcat(buf, "Exact"); - else if (match & MATCH_TYPE_WILDCHAR_PATH) - strcat(buf, "Wildchar"); -/* deprecated - else if (match & MATCH_TYPE_CONTEXT) - strcat(buf, "Context"); - else if (match & MATCH_TYPE_CONTEXT_PATH) - strcat(buf, "Context Path"); - else if (match & MATCH_TYPE_SUFFIX) - strcat(buf, "Suffix"); - else if (match & MATCH_TYPE_GENERAL_SUFFIX) - return "General Suffix"; - */ - else - strcat(buf, "Unknown"); - return buf; -} - -/* - * Given context uri, count the number of path tokens. - * - * Servlet specification 2.4, SRV.11.1 says - - * The container will recursively try tomatch the longest - * path-prefix. This is done by stepping down the path tree a - * directory at a time, using the / character as a path - * separator. The longest match determines the servlet selected. - * - * The implication seems to be `most uri path elements is most exact'. - * This is a little helper function to count uri tokens, so we can - * keep the worker map sorted with most specific first. - */ -static int worker_count_context_uri_tokens(const char * context) -{ - const char * c = context; - int count = 0; - while (c && *c) { - if ('/' == *c++) - count++; - } - return count; -} - -static int worker_compare(const void *elem1, const void *elem2) -{ - uri_worker_record_t *e1 = *(uri_worker_record_t **)elem1; - uri_worker_record_t *e2 = *(uri_worker_record_t **)elem2; - int e1_tokens = 0; - int e2_tokens = 0; - - e1_tokens = worker_count_context_uri_tokens(e1->context); - e2_tokens = worker_count_context_uri_tokens(e2->context); - - if (e1_tokens != e2_tokens) { - return (e2_tokens - e1_tokens); - } - /* given the same number of URI tokens, use character - * length as a tie breaker - */ - if(e2->context_len != e1->context_len) - return ((int)e2->context_len - (int)e1->context_len); - - return ((int)e2->source_type - (int)e1->source_type); -} - -static void worker_qsort(jk_uri_worker_map_t *uw_map) -{ - - /* Sort remaining args using Quicksort algorithm: */ - qsort((void *)IND_NEXT(uw_map->maps), IND_NEXT(uw_map->size), - sizeof(uri_worker_record_t *), worker_compare ); - -} - -/* Dump the map contents - only call if debug log is active. */ -static void uri_worker_map_dump(jk_uri_worker_map_t *uw_map, - const char *reason, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - if (uw_map) { - int i, off, k; - uri_worker_record_t *uwr = NULL; - char buf[32]; - jk_log(l, JK_LOG_DEBUG, "uri map dump %s: index=%d file='%s' reject_unsafe=%d " - "reload=%d modified=%d checked=%d", - reason, uw_map->index, STRNULL_FOR_NULL(uw_map->fname), uw_map->reject_unsafe, - uw_map->reload, uw_map->modified, uw_map->checked); - for(i=0;i<=1;i++) { - jk_log(l, JK_LOG_DEBUG, "generation %d: size=%d nosize=%d capacity=%d", - i, uw_map->size[i], uw_map->nosize[i], uw_map->capacity[i], uw_map->maps[i]); - } - - off = uw_map->index; - for(i=0;i<=1;i++) { - unsigned int j; - k = (i + off) % 2; - for (j = 0; j < uw_map->size[k]; j++) { - uwr = uw_map->maps[k][j]; - jk_log(l, JK_LOG_DEBUG, "%s (%d) map #%d: uri=%s worker=%s context=%s " - "source=%s type=%s len=%d", - i ? "NEXT" : "THIS", i, j, - STRNULL_FOR_NULL(uwr->uri), STRNULL_FOR_NULL(uwr->worker_name), - STRNULL_FOR_NULL(uwr->context), STRNULL_FOR_NULL(uri_worker_map_get_source(uwr,l)), - STRNULL_FOR_NULL(uri_worker_map_get_match(uwr,buf,l)), uwr->context_len); - } - } - } - JK_TRACE_EXIT(l); -} - - -int uri_worker_map_alloc(jk_uri_worker_map_t **uw_map_p, - jk_map_t *init_data, jk_logger_t *l) -{ - int i; - - JK_TRACE_ENTER(l); - - if (uw_map_p) { - int rc; - jk_uri_worker_map_t *uw_map; - *uw_map_p = (jk_uri_worker_map_t *)calloc(1, sizeof(jk_uri_worker_map_t)); - uw_map = *uw_map_p; - - JK_INIT_CS(&(uw_map->cs), rc); - if (rc == JK_FALSE) { - jk_log(l, JK_LOG_ERROR, - "creating thread lock (errno=%d)", - errno); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - jk_open_pool(&(uw_map->p), - uw_map->buf, sizeof(jk_pool_atom_t) * BIG_POOL_SIZE); - for(i=0;i<=1;i++) { - jk_open_pool(&(uw_map->p_dyn[i]), - uw_map->buf_dyn[i], sizeof(jk_pool_atom_t) * BIG_POOL_SIZE); - uw_map->size[i] = 0; - uw_map->nosize[i] = 0; - uw_map->capacity[i] = 0; - uw_map->maps[i] = NULL; - } - uw_map->index = 0; - uw_map->fname = NULL; - uw_map->reject_unsafe = 0; - uw_map->reload = JK_URIMAP_DEF_RELOAD; - uw_map->modified = 0; - uw_map->checked = 0; - - if (init_data) - rc = uri_worker_map_open(uw_map, init_data, l); - JK_TRACE_EXIT(l); - return rc; - } - - JK_LOG_NULL_PARAMS(l); - JK_TRACE_EXIT(l); - - return JK_FALSE; -} - -static int uri_worker_map_close(jk_uri_worker_map_t *uw_map, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - - if (uw_map) { - int i; - JK_DELETE_CS(&(uw_map->cs), i); - jk_close_pool(&uw_map->p_dyn[0]); - jk_close_pool(&uw_map->p_dyn[1]); - jk_close_pool(&uw_map->p); - JK_TRACE_EXIT(l); - return JK_TRUE; - } - - JK_LOG_NULL_PARAMS(l); - JK_TRACE_EXIT(l); - return JK_FALSE; -} - -int uri_worker_map_free(jk_uri_worker_map_t **uw_map, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - - if (uw_map && *uw_map) { - uri_worker_map_close(*uw_map, l); - free(*uw_map); - *uw_map = NULL; - JK_TRACE_EXIT(l); - return JK_TRUE; - } - else - JK_LOG_NULL_PARAMS(l); - - JK_TRACE_EXIT(l); - return JK_FALSE; -} - -/* - * Ensure there will be memory in context info to store Context Bases - */ - -#define UW_INC_SIZE 4 /* 4 URI->WORKER STEP */ - -static int uri_worker_map_realloc(jk_uri_worker_map_t *uw_map) -{ - if (IND_NEXT(uw_map->size) == IND_NEXT(uw_map->capacity)) { - uri_worker_record_t **uwr; - int capacity = IND_NEXT(uw_map->capacity) + UW_INC_SIZE; - - uwr = - (uri_worker_record_t **) jk_pool_alloc(&IND_NEXT(uw_map->p_dyn), - sizeof(uri_worker_record_t - *) * capacity); - - if (!uwr) - return JK_FALSE; - - if (IND_NEXT(uw_map->capacity) && IND_NEXT(uw_map->maps)) - memcpy(uwr, IND_NEXT(uw_map->maps), - sizeof(uri_worker_record_t *) * IND_NEXT(uw_map->capacity)); - - IND_NEXT(uw_map->maps) = uwr; - IND_NEXT(uw_map->capacity) = capacity; - } - - return JK_TRUE; -} - - -/* - * Delete all entries of a given source type - */ - -static int uri_worker_map_clear(jk_uri_worker_map_t *uw_map, - jk_logger_t *l) -{ - uri_worker_record_t *uwr = NULL; - unsigned int i; - unsigned int new_size = 0; - unsigned int new_nosize = 0; - - JK_TRACE_ENTER(l); - - IND_NEXT(uw_map->maps) = - (uri_worker_record_t **) jk_pool_alloc(&(IND_NEXT(uw_map->p_dyn)), - sizeof(uri_worker_record_t - *) * IND_THIS(uw_map->size)); - IND_NEXT(uw_map->capacity) = IND_THIS(uw_map->size); - IND_NEXT(uw_map->size) = 0; - IND_NEXT(uw_map->nosize) = 0; - for (i = 0; i < IND_THIS(uw_map->size); i++) { - uwr = IND_THIS(uw_map->maps)[i]; - if (uwr->source_type == SOURCE_TYPE_URIMAP) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "deleting map rule '%s=%s' source '%s'", - uwr->context, uwr->worker_name, uri_worker_map_get_source(uwr, l)); - } - else { - IND_NEXT(uw_map->maps)[new_size] = uwr; - new_size++; - if (uwr->match_type & MATCH_TYPE_NO_MATCH) - new_nosize++; - } - } - IND_NEXT(uw_map->size) = new_size; - IND_NEXT(uw_map->nosize) = new_nosize; - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -static void extract_activation(jk_uri_worker_map_t *uw_map, - uri_worker_record_t *uwr, - lb_worker_t *lb, - int *activations, - char *workers, - int activation, - jk_logger_t *l) -{ - unsigned int i; - jk_pool_t *p; - char *worker; -#ifdef _MT_CODE_PTHREAD - char *lasts; -#endif - - JK_TRACE_ENTER(l); - - if (uwr->source_type == SOURCE_TYPE_URIMAP) - p = &IND_NEXT(uw_map->p_dyn); - else - p = &uw_map->p; - worker = jk_pool_strdup(p, workers); - -#ifdef _MT_CODE_PTHREAD - for (worker = strtok_r(worker, ", ", &lasts); - worker; worker = strtok_r(NULL, ", ", &lasts)) { -#else - for (worker = strtok(worker, ", "); worker; worker = strtok(NULL, ", ")) { -#endif - for (i=0; inum_of_workers; i++) { - if (!strcmp(worker, lb->lb_workers[i].name)) { - if (activations[i] != JK_LB_ACTIVATION_UNSET) - jk_log(l, JK_LOG_WARNING, - "inconsistent activation overwrite for member %s " - "of load balancer %s: '%s' replaced by '%s'", - worker, lb->name, - jk_lb_get_activation_direct(activations[i], l), - jk_lb_get_activation_direct(activation, l)); - activations[i] = activation; - break; - } - } - if (i >= lb->num_of_workers) - jk_log(l, JK_LOG_WARNING, - "could not find member %s of load balancer %s", - worker, lb->name); - } - - JK_TRACE_EXIT(l); - -} - -static void extract_fail_on_status(jk_uri_worker_map_t *uw_map, - uri_worker_record_t *uwr, - jk_logger_t *l) -{ - unsigned int i; - int j; - int cnt = 1; - jk_pool_t *p; - char *status; -#ifdef _MT_CODE_PTHREAD - char *lasts; -#endif - - JK_TRACE_ENTER(l); - - for (i=0; iextensions.fail_on_status_str); i++) { - if (uwr->extensions.fail_on_status_str[i] == ',' || - uwr->extensions.fail_on_status_str[i] == ' ') - cnt++; - } - uwr->extensions.fail_on_status_size = cnt; - - if (uwr->source_type == SOURCE_TYPE_URIMAP) - p = &IND_NEXT(uw_map->p_dyn); - else - p = &uw_map->p; - status = jk_pool_strdup(p, uwr->extensions.fail_on_status_str); - uwr->extensions.fail_on_status = (int *)jk_pool_alloc(p, - uwr->extensions.fail_on_status_size * sizeof(int)); - if (!uwr->extensions.fail_on_status) { - jk_log(l, JK_LOG_ERROR, - "can't alloc extensions fail_on_status list"); - JK_TRACE_EXIT(l); - return; - } else if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Allocated fail_on_status array of size %d for worker %s", - uwr->extensions.fail_on_status_size, uwr->worker_name); - - - for (j=0; jextensions.fail_on_status_size; j++) { - uwr->extensions.fail_on_status[j] = 0; - } - - cnt = 0; -#ifdef _MT_CODE_PTHREAD - for (status = strtok_r(status, ", ", &lasts); - status; status = strtok_r(NULL, ", ", &lasts)) { -#else - for (status = strtok(status, ", "); status; status = strtok(NULL, ", ")) { -#endif - uwr->extensions.fail_on_status[cnt] = atoi(status); - cnt++; - } - - JK_TRACE_EXIT(l); - -} - -void uri_worker_map_switch(jk_uri_worker_map_t *uw_map, jk_logger_t *l) -{ - int new_index; - - JK_TRACE_ENTER(l); - - if (uw_map) { - new_index = IND_SWITCH(uw_map->index); - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Switching uri worker map from index %d to index %d", - uw_map->index, new_index); - uw_map->index = new_index; - jk_reset_pool(&(IND_NEXT(uw_map->p_dyn))); - } - - JK_TRACE_EXIT(l); - -} - -void uri_worker_map_ext(jk_uri_worker_map_t *uw_map, jk_logger_t *l) -{ - unsigned int i; - - JK_TRACE_ENTER(l); - - for (i = 0; i < IND_NEXT(uw_map->size); i++) { - uri_worker_record_t *uwr = IND_NEXT(uw_map->maps)[i]; - jk_worker_t *jw; - if(uwr->match_type & MATCH_TYPE_NO_MATCH) - continue; - jw = wc_get_worker_for_name(uwr->worker_name, l); - if(!jw) { - jk_log(l, JK_LOG_ERROR, - "Could not find worker with name '%s' in uri map post processing.", - uwr->worker_name); - continue; - } - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Checking extension for worker %d: %s of type %s (%d)", - i, uwr->worker_name, wc_get_name_for_type(jw->type,l), jw->type); - - if (jw->type == JK_LB_WORKER_TYPE && - (uwr->extensions.active || uwr->extensions.disabled || uwr->extensions.stopped)) { - int j; - lb_worker_t *lb = (lb_worker_t *)jw->worker_private; - jk_pool_t *p; - if (!uwr->extensions.activation) { - uwr->extensions.activation_size = lb->num_of_workers; - if (uwr->source_type == SOURCE_TYPE_URIMAP) - p = &IND_NEXT(uw_map->p_dyn); - else - p = &uw_map->p; - uwr->extensions.activation = (int *)jk_pool_alloc(p, - uwr->extensions.activation_size * sizeof(int)); - if (!uwr->extensions.activation) { - jk_log(l, JK_LOG_ERROR, - "can't alloc extensions activation list"); - continue; - } else if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Allocated activations array of size %d for lb worker %s", - uwr->extensions.activation_size, uwr->worker_name); - for (j=0; jextensions.activation_size; j++) { - uwr->extensions.activation[j] = JK_LB_ACTIVATION_UNSET; - } - } - if (uwr->extensions.active) - extract_activation(uw_map, uwr, lb, uwr->extensions.activation, - uwr->extensions.active, JK_LB_ACTIVATION_ACTIVE, l); - if (uwr->extensions.disabled) - extract_activation(uw_map, uwr, lb, uwr->extensions.activation, - uwr->extensions.disabled, JK_LB_ACTIVATION_DISABLED, l); - if (uwr->extensions.stopped) - extract_activation(uw_map, uwr, lb, uwr->extensions.activation, - uwr->extensions.stopped, JK_LB_ACTIVATION_STOPPED, l); - } - else if (uwr->extensions.active) { - jk_log(l, JK_LOG_WARNING, - "Worker %s is not of type lb, activation extension " - JK_UWMAP_EXTENSION_ACTIVE " for %s ignored", - uwr->worker_name, uwr->extensions.active); - } - else if (uwr->extensions.disabled) { - jk_log(l, JK_LOG_WARNING, - "Worker %s is not of type lb, activation extension " - JK_UWMAP_EXTENSION_DISABLED " for %s ignored", - uwr->worker_name, uwr->extensions.disabled); - } - else if (uwr->extensions.stopped) { - jk_log(l, JK_LOG_WARNING, - "Worker %s is not of type lb, activation extension " - JK_UWMAP_EXTENSION_STOPPED " for %s ignored", - uwr->worker_name, uwr->extensions.stopped); - } - if (uwr->extensions.fail_on_status_str) { - extract_fail_on_status(uw_map, uwr, l); - } - } - if (JK_IS_DEBUG_LEVEL(l)) - uri_worker_map_dump(uw_map, "after extension stripping", l); - - JK_TRACE_EXIT(l); - return; - -} - -/* Add new entry to NEXT generation */ -int uri_worker_map_add(jk_uri_worker_map_t *uw_map, - const char *puri, const char *worker, - unsigned int source_type, jk_logger_t *l) -{ - uri_worker_record_t *uwr = NULL; - char *uri; - jk_pool_t *p; - unsigned int match_type = 0; - - JK_TRACE_ENTER(l); - - if (*puri == '-') { - /* Disable urimap. - * This way you can disable already mounted - * context. - */ - match_type = MATCH_TYPE_DISABLED; - puri++; - } - if (*puri == '!') { - match_type |= MATCH_TYPE_NO_MATCH; - puri++; - } - - if (uri_worker_map_realloc(uw_map) == JK_FALSE) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - if (source_type == SOURCE_TYPE_URIMAP) - p = &IND_NEXT(uw_map->p_dyn); - else - p = &uw_map->p; - - uwr = (uri_worker_record_t *)jk_pool_alloc(p, sizeof(uri_worker_record_t)); - if (!uwr) { - jk_log(l, JK_LOG_ERROR, - "can't alloc map entry"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - uri = jk_pool_strdup(p, puri); - if (!uri || !worker) { - jk_log(l, JK_LOG_ERROR, - "can't alloc uri/worker strings"); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (*uri == '/') { - char *w; - char *param; -#ifdef _MT_CODE_PTHREAD - char *lasts = NULL; -#endif - - w = jk_pool_strdup(p, worker); - uwr->extensions.reply_timeout = -1; - uwr->extensions.active = NULL; - uwr->extensions.disabled = NULL; - uwr->extensions.stopped = NULL; - uwr->extensions.activation_size = 0; - uwr->extensions.activation = NULL; - uwr->extensions.fail_on_status_size = 0; - uwr->extensions.fail_on_status = NULL; - uwr->extensions.fail_on_status_str = NULL; - uwr->extensions.use_server_error_pages = 0; - -#ifdef _MT_CODE_PTHREAD - param = strtok_r(w, ";", &lasts); -#else - param = strtok(w, ";"); -#endif - if (param) { -#ifdef _MT_CODE_PTHREAD - for (param = strtok_r(NULL, ";", &lasts); param; param = strtok_r(NULL, ";", &lasts)) { -#else - for (param = strtok(NULL, ";"); param; param = strtok(NULL, ";")) { -#endif - if (!strncmp(param, JK_UWMAP_EXTENSION_REPLY_TIMEOUT, strlen(JK_UWMAP_EXTENSION_REPLY_TIMEOUT))) { - uwr->extensions.reply_timeout = atoi(param + strlen(JK_UWMAP_EXTENSION_REPLY_TIMEOUT)); - } - else if (!strncmp(param, JK_UWMAP_EXTENSION_USE_SRV_ERRORS, strlen(JK_UWMAP_EXTENSION_USE_SRV_ERRORS))) { - uwr->extensions.use_server_error_pages = atoi(param + strlen(JK_UWMAP_EXTENSION_USE_SRV_ERRORS)); - } - else if (!strncmp(param, JK_UWMAP_EXTENSION_ACTIVE, strlen(JK_UWMAP_EXTENSION_ACTIVE))) { - if (uwr->extensions.active) - jk_log(l, JK_LOG_WARNING, - "extension '%s' in uri worker map only allowed once", - JK_UWMAP_EXTENSION_ACTIVE); - else - uwr->extensions.active = param + strlen(JK_UWMAP_EXTENSION_ACTIVE); - } - else if (!strncmp(param, JK_UWMAP_EXTENSION_DISABLED, strlen(JK_UWMAP_EXTENSION_DISABLED))) { - if (uwr->extensions.disabled) - jk_log(l, JK_LOG_WARNING, - "extension '%s' in uri worker map only allowed once", - JK_UWMAP_EXTENSION_DISABLED); - else - uwr->extensions.disabled = param + strlen(JK_UWMAP_EXTENSION_DISABLED); - } - else if (!strncmp(param, JK_UWMAP_EXTENSION_STOPPED, strlen(JK_UWMAP_EXTENSION_STOPPED))) { - if (uwr->extensions.stopped) - jk_log(l, JK_LOG_WARNING, - "extension '%s' in uri worker map only allowed once", - JK_UWMAP_EXTENSION_STOPPED); - else - uwr->extensions.stopped = param + strlen(JK_UWMAP_EXTENSION_STOPPED); - } - else if (!strncmp(param, JK_UWMAP_EXTENSION_FAIL_ON_STATUS, strlen(JK_UWMAP_EXTENSION_FAIL_ON_STATUS))) { - if (uwr->extensions.fail_on_status_str) - jk_log(l, JK_LOG_WARNING, - "extension '%s' in uri worker map only allowed once", - JK_UWMAP_EXTENSION_FAIL_ON_STATUS); - else - uwr->extensions.fail_on_status_str = param + strlen(JK_UWMAP_EXTENSION_FAIL_ON_STATUS); - } - else { - jk_log(l, JK_LOG_WARNING, - "unknown extension '%s' in uri worker map", - param); - } - } - } - - uwr->source_type = source_type; - uwr->worker_name = w; - uwr->uri = uri; - uwr->context = uri; - uwr->context_len = strlen(uwr->context); - if (strchr(uri, '*') || - strchr(uri, '?')) { - /* Something like - * /context/ * /user/ * - * /context/ *.suffix - */ - match_type |= MATCH_TYPE_WILDCHAR_PATH; - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "wildchar rule '%s=%s' source '%s' was added", - uwr->context, uwr->worker_name, uri_worker_map_get_source(uwr, l)); - - } - else { - /* Something like: JkMount /login/j_security_check ajp13 */ - match_type |= MATCH_TYPE_EXACT; - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "exact rule '%s=%s' source '%s' was added", - uwr->context, uwr->worker_name, uri_worker_map_get_source(uwr, l)); - } - } - else { - /* - * JFC: please check... - * Not sure what to do, but I try to prevent problems. - * I have fixed jk_mount_context() in apaches/mod_jk.c so we should - * not arrive here when using Apache. - */ - jk_log(l, JK_LOG_ERROR, - "invalid context '%s': does not begin with '/'", - uri); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - uwr->match_type = match_type; - IND_NEXT(uw_map->maps)[IND_NEXT(uw_map->size)] = uwr; - IND_NEXT(uw_map->size)++; - if (match_type & MATCH_TYPE_NO_MATCH) { - /* If we split the mappings this one will be calculated */ - IND_NEXT(uw_map->nosize)++; - } - worker_qsort(uw_map); - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -int uri_worker_map_open(jk_uri_worker_map_t *uw_map, - jk_map_t *init_data, jk_logger_t *l) -{ - int rc = JK_TRUE; - - JK_TRACE_ENTER(l); - - if (uw_map) { - int sz = jk_map_size(init_data); - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "rule map size is %d", - sz); - - if (sz > 0) { - int i; - for (i = 0; i < sz; i++) { - const char *u = jk_map_name_at(init_data, i); - const char *w = jk_map_value_at(init_data, i); - /* Multiple mappings like : - * /servlets-examples|/ * - * will create two mappings: - * /servlets-examples - * and: - * /servlets-examples/ * - */ - if (strchr(u, '|')) { - char *s, *r = strdup(u); - s = strchr(r, '|'); - *(s++) = '\0'; - /* Add first mapping */ - if (!uri_worker_map_add(uw_map, r, w, SOURCE_TYPE_JKMOUNT, l)) { - jk_log(l, JK_LOG_ERROR, - "invalid mapping rule %s->%s", r, w); - rc = JK_FALSE; - } - for (; *s; s++) - *(s - 1) = *s; - *(s - 1) = '\0'; - /* add second mapping */ - if (!uri_worker_map_add(uw_map, r, w, SOURCE_TYPE_JKMOUNT, l)) { - jk_log(l, JK_LOG_ERROR, - "invalid mapping rule %s->%s", r, w); - rc = JK_FALSE; - } - free(r); - } - else if (!uri_worker_map_add(uw_map, u, w, SOURCE_TYPE_JKMOUNT, l)) { - jk_log(l, JK_LOG_ERROR, - "invalid mapping rule %s->%s", - u, w); - rc = JK_FALSE; - break; - } - if (rc == JK_FALSE) - break; - } - } - - if (rc == JK_FALSE) { - jk_log(l, JK_LOG_ERROR, - "there was an error, freeing buf"); - jk_close_pool(&uw_map->p_dyn[0]); - jk_close_pool(&uw_map->p_dyn[1]); - jk_close_pool(&uw_map->p); - } - else if (JK_IS_DEBUG_LEVEL(l)) - uri_worker_map_dump(uw_map, "after map open", l); - } - - JK_TRACE_EXIT(l); - return rc; -} - -static int find_match(jk_uri_worker_map_t *uw_map, - const char *url, jk_logger_t *l) -{ - unsigned int i; - - JK_TRACE_ENTER(l); - - for (i = 0; i < IND_THIS(uw_map->size); i++) { - uri_worker_record_t *uwr = IND_THIS(uw_map->maps)[i]; - - /* Check for match types */ - if ((uwr->match_type & MATCH_TYPE_DISABLED) || - (uwr->match_type & MATCH_TYPE_NO_MATCH)) - continue; - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, "Attempting to map context URI '%s=%s' source '%s'", - uwr->context, uwr->worker_name, uri_worker_map_get_source(uwr, l)); - - if (uwr->match_type & MATCH_TYPE_WILDCHAR_PATH) { - /* Map is already sorted by context_len */ - if (jk_wildchar_match(url, uwr->context, -#ifdef WIN32 - 0 -#else - 0 -#endif - ) == 0) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Found a wildchar match '%s=%s'", - uwr->context, uwr->worker_name); - JK_TRACE_EXIT(l); - return i; - } - } - else if (JK_STRNCMP(uwr->context, url, uwr->context_len) == 0) { - if (strlen(url) == uwr->context_len) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Found an exact match '%s=%s'", - uwr->context, uwr->worker_name); - JK_TRACE_EXIT(l); - return i; - } - } - } - - JK_TRACE_EXIT(l); - return -1; -} - -static int is_nomatch(jk_uri_worker_map_t *uw_map, - const char *uri, int match, - jk_logger_t *l) -{ - unsigned int i; - const char *worker = IND_THIS(uw_map->maps)[match]->worker_name; - - JK_TRACE_ENTER(l); - - for (i = 0; i < IND_THIS(uw_map->size); i++) { - uri_worker_record_t *uwr = IND_THIS(uw_map->maps)[i]; - - /* Check only nomatch mappings */ - if (!(uwr->match_type & MATCH_TYPE_NO_MATCH) || - (uwr->match_type & MATCH_TYPE_DISABLED)) - continue; - /* Check only matching workers */ - if (strcmp(uwr->worker_name, worker) && - strcmp(uwr->worker_name, "*")) - continue; - if (uwr->match_type & MATCH_TYPE_WILDCHAR_PATH) { - /* Map is already sorted by context_len */ - if (jk_wildchar_match(uri, uwr->context, -#ifdef WIN32 - 0 -#else - 0 -#endif - ) == 0) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Found a wildchar no match '%s=%s' source '%s'", - uwr->context, uwr->worker_name, uri_worker_map_get_source(uwr, l)); - JK_TRACE_EXIT(l); - return JK_TRUE; - } - } - else if (JK_STRNCMP(uwr->context, uri, uwr->context_len) == 0) { - if (strlen(uri) == uwr->context_len) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Found an exact no match '%s=%s' source '%s'", - uwr->context, uwr->worker_name, uri_worker_map_get_source(uwr, l)); - JK_TRACE_EXIT(l); - return JK_TRUE; - } - } - } - - JK_TRACE_EXIT(l); - return JK_FALSE; -} - -const char *map_uri_to_worker_ext(jk_uri_worker_map_t *uw_map, - const char *uri, const char *vhost, - rule_extension_t **extensions, - int *index, - jk_logger_t *l) -{ - unsigned int i; - unsigned int vhost_len; - int reject_unsafe; - int rv = -1; - char url[JK_MAX_URI_LEN+1]; - - JK_TRACE_ENTER(l); - - if (!uw_map || !uri || !extensions) { - JK_LOG_NULL_PARAMS(l); - JK_TRACE_EXIT(l); - return NULL; - } - *extensions = NULL; - if (index) - *index = -1; - if (*uri != '/') { - jk_log(l, JK_LOG_WARNING, - "Uri %s is invalid. Uri must start with /", uri); - JK_TRACE_EXIT(l); - return NULL; - } - if (uw_map->fname) { - uri_worker_map_update(uw_map, 0, l); - if (!IND_THIS(uw_map->size)) { - jk_log(l, JK_LOG_INFO, - "No worker maps defined for %s.", - uw_map->fname); - JK_TRACE_EXIT(l); - return NULL; - } - } - /* Make the copy of the provided uri and strip - * everything after the first ';' char. - */ - reject_unsafe = uw_map->reject_unsafe; - vhost_len = 0; - /* - * In case we got a vhost, we prepend a slash - * and the vhost to the url in order to enable - * vhost mapping rules especially for IIS. - */ - if (vhost) { - int off = 0; - /* Add leading '/' if necessary */ - if (vhost[0] != '/') { - url[0] = '/'; - off = 1; - } - /* Size including leading slash. */ - vhost_len = strlen(vhost); - if (vhost_len + off >= JK_MAX_URI_LEN) { - vhost_len = 0; - jk_log(l, JK_LOG_WARNING, - "Host prefix %s for URI %s is invalid and will be ignored." - " It must be smaller than %d chars", - vhost, JK_MAX_URI_LEN - off); - } - else { - strncpy(&url[off], vhost, vhost_len + 1); - } - vhost_len += off; - } - for (i = 0; i < strlen(uri); i++) { - if (i == JK_MAX_URI_LEN) { - jk_log(l, JK_LOG_WARNING, - "URI %s is invalid. URI must be smaller than %d chars", - uri, JK_MAX_URI_LEN); - JK_TRACE_EXIT(l); - return NULL; - } - if (uri[i] == ';') - break; - else { - url[i + vhost_len] = uri[i]; - if (reject_unsafe && (uri[i] == '%' || uri[i] == '\\')) { - jk_log(l, JK_LOG_INFO, "Potentially unsafe request url '%s' rejected", uri); - JK_TRACE_EXIT(l); - return NULL; - } - } - } - url[i + vhost_len] = '\0'; - - if (JK_IS_DEBUG_LEVEL(l)) { - char *url_rewrite = strstr(uri, JK_PATH_SESSION_IDENTIFIER); - if (url_rewrite) - jk_log(l, JK_LOG_DEBUG, "Found session identifier '%s' in url '%s'", - url_rewrite, uri); - } - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, "Attempting to map URI '%s' from %d maps", - url, IND_THIS(uw_map->size)); - rv = find_match(uw_map, url, l); - /* If this doesn't find a match, try without the vhost. */ - if (rv < 0 && vhost_len) { - rv = find_match(uw_map, &url[vhost_len], l); - } - - /* In case we found a match, check for the unmounts. */ - if (rv >= 0 && IND_THIS(uw_map->nosize)) { - /* Again first including vhost. */ - int rc = is_nomatch(uw_map, url, rv, l); - /* If no unmount was find, try without vhost. */ - if (!rc && vhost_len) - rc = is_nomatch(uw_map, &url[vhost_len], rv, l); - if (rc) { - if (JK_IS_DEBUG_LEVEL(l)) { - jk_log(l, JK_LOG_DEBUG, - "Denying match for worker %s by nomatch rule", - IND_THIS(uw_map->maps)[rv]->worker_name); - } - rv = -1; - } - } - - if (rv >= 0) { - *extensions = &(IND_THIS(uw_map->maps)[rv]->extensions); - if (index) - *index = rv; - JK_TRACE_EXIT(l); - return IND_THIS(uw_map->maps)[rv]->worker_name; - } - JK_TRACE_EXIT(l); - return NULL; -} - -rule_extension_t *get_uri_to_worker_ext(jk_uri_worker_map_t *uw_map, - int index) -{ - if (index >= 0) { - return &(IND_THIS(uw_map->maps)[index]->extensions); - } - else { - return NULL; - } -} - -const char *map_uri_to_worker(jk_uri_worker_map_t *uw_map, - const char *uri, const char *vhost, - jk_logger_t *l) -{ - rule_extension_t *ext; - return map_uri_to_worker_ext(uw_map, uri, vhost, &ext, NULL, l); -} - -int uri_worker_map_load(jk_uri_worker_map_t *uw_map, - jk_logger_t *l) -{ - int rc = JK_FALSE; - jk_map_t *map; - - jk_map_alloc(&map); - if (jk_map_read_properties(map, NULL, uw_map->fname, &uw_map->modified, - JK_MAP_HANDLE_NORMAL, l)) { - int i; - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Loading urimaps from %s with reload check interval %d seconds", - uw_map->fname, uw_map->reload); - uri_worker_map_clear(uw_map, l); - for (i = 0; i < jk_map_size(map); i++) { - const char *u = jk_map_name_at(map, i); - const char *w = jk_map_value_at(map, i); - /* Multiple mappings like : - * /servlets-examples|/ * - * will create two mappings: - * /servlets-examples - * and: - * /servlets-examples/ * - */ - if (strchr(u, '|')) { - char *s, *r = strdup(u); - s = strchr(r, '|'); - *(s++) = '\0'; - /* Add first mapping */ - if (!uri_worker_map_add(uw_map, r, w, SOURCE_TYPE_URIMAP, l)) { - jk_log(l, JK_LOG_ERROR, - "invalid mapping rule %s->%s", r, w); - } - for (; *s; s++) - *(s - 1) = *s; - *(s - 1) = '\0'; - /* add second mapping */ - if (!uri_worker_map_add(uw_map, r, w, SOURCE_TYPE_URIMAP, l)) { - jk_log(l, JK_LOG_ERROR, - "invalid mapping rule %s->%s", r, w); - } - free(r); - } - else if (!uri_worker_map_add(uw_map, u, w, SOURCE_TYPE_URIMAP, l)) { - jk_log(l, JK_LOG_ERROR, - "invalid mapping rule %s->%s", - u, w); - } - } - uw_map->checked = time(NULL); - if (JK_IS_DEBUG_LEVEL(l)) - uri_worker_map_dump(uw_map, "after file load", l); - rc = JK_TRUE; - } - jk_map_free(&map); - return rc; -} - -int uri_worker_map_update(jk_uri_worker_map_t *uw_map, - int force, jk_logger_t *l) -{ - int rc = JK_TRUE; - time_t now = time(NULL); - - if (force || (uw_map->reload > 0 && difftime(now, uw_map->checked) > - uw_map->reload)) { - struct stat statbuf; - uw_map->checked = now; - if ((rc = jk_stat(uw_map->fname, &statbuf)) == -1) { - jk_log(l, JK_LOG_ERROR, - "Unable to stat the %s (errno=%d)", - uw_map->fname, errno); - return JK_FALSE; - } - if (statbuf.st_mtime == uw_map->modified) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "File %s is not modified", - uw_map->fname); - return JK_TRUE; - } - JK_ENTER_CS(&(uw_map->cs), rc); - /* Check if some other thread updated status */ - if (statbuf.st_mtime == uw_map->modified) { - JK_LEAVE_CS(&(uw_map->cs), rc); - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "File %s is not modified", - uw_map->fname); - return JK_TRUE; - } - rc = uri_worker_map_load(uw_map, l); - uri_worker_map_ext(uw_map, l); - uri_worker_map_switch(uw_map, l); - JK_LEAVE_CS(&(uw_map->cs), rc); - jk_log(l, JK_LOG_INFO, - "Reloaded urimaps from %s", uw_map->fname); - } - return JK_TRUE; -} diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.h deleted file mode 100644 index 30091dc4..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.h +++ /dev/null @@ -1,208 +0,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. - */ - -/*************************************************************************** - * Description: URI to worker mapper header file * - * Author: Gal Shachor * - * Version: $Revision: 705283 $ * - ***************************************************************************/ - -#ifndef JK_URI_WORKER_MAP_H -#define JK_URI_WORKER_MAP_H - - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -#include "jk_global.h" -#include "jk_map.h" -#include "jk_logger.h" -#include "jk_mt.h" - -#define MATCH_TYPE_EXACT 0x0001 -/* deprecated -#define MATCH_TYPE_CONTEXT 0x0002 - */ -/* match all context path URIs with a path component suffix */ -/* deprecated -#define MATCH_TYPE_CONTEXT_PATH 0x0004 - */ -/* deprecated -#define MATCH_TYPE_SUFFIX 0x0010 - */ -/* match all URIs of the form *ext */ -/* deprecated -#define MATCH_TYPE_GENERAL_SUFFIX 0x0020 - */ -/* match multiple wild characters (*) and (?) */ -#define MATCH_TYPE_WILDCHAR_PATH 0x0040 -#define MATCH_TYPE_NO_MATCH 0x1000 -#define MATCH_TYPE_DISABLED 0x2000 -/* deprecated -#define MATCH_TYPE_STOPPED 0x4000 - */ - -#define SOURCE_TYPE_WORKERDEF 0x0001 -#define SOURCE_TYPE_JKMOUNT 0x0002 -#define SOURCE_TYPE_URIMAP 0x0003 -#define SOURCE_TYPE_DISCOVER 0x0004 -#define SOURCE_TYPE_TEXT_WORKERDEF ("worker definition") -#define SOURCE_TYPE_TEXT_JKMOUNT ("JkMount") -#define SOURCE_TYPE_TEXT_URIMAP ("uriworkermap") -#define SOURCE_TYPE_TEXT_DISCOVER ("ajp14") - -#define JK_MAX_URI_LEN 4095 - -struct rule_extension -{ - /* reply_timeout overwrite */ - int reply_timeout; - /* activation state overwrites for load balancers */ - /* Number of elements in the array activations. */ - int activation_size; - /* Dynamically allocated array with one entry per lb member. */ - int *activation; - /* Temporary storage for the original extension strings. */ - char *active; - char *disabled; - char *stopped; - /* fail_on_status overwrites */ - /* Number of elements in the array fail_on_status. */ - int fail_on_status_size; - /* Dynamically allocated array with one entry per status. */ - int *fail_on_status; - /* Temporary storage for the original extension strings. */ - char *fail_on_status_str; - /* Use server error pages for responses >= 400. */ - int use_server_error_pages; -}; -typedef struct rule_extension rule_extension_t; - -struct uri_worker_record -{ - /* Original uri for logging */ - char *uri; - - /* Name of worker mapped */ - const char *worker_name; - - /* Base context */ - const char *context; - - /* Match type */ - unsigned int match_type; - - /* Definition source type */ - unsigned int source_type; - - /* char length of the context */ - size_t context_len; - - /* extended mapping properties */ - rule_extension_t extensions; -}; -typedef struct uri_worker_record uri_worker_record_t; - -struct jk_uri_worker_map -{ - /* Memory Pool */ - jk_pool_t p; - jk_pool_atom_t buf[BIG_POOL_SIZE]; - - /* Index 0 or 1, which map instance do we use */ - /* Needed to make map reload more atomically */ - int index; - - /* Memory Pool - cleared when doing reload */ - /* Use this pool to allocate objects, that are deleted */ - /* when the map gets dynamically reloaded from uriworkermap.properties. */ - jk_pool_t p_dyn[2]; - jk_pool_atom_t buf_dyn[2][BIG_POOL_SIZE]; - - /* map URI->WORKER */ - uri_worker_record_t **maps[2]; - - /* Map Number */ - unsigned int size[2]; - - /* Map Capacity */ - unsigned int capacity[2]; - - /* NoMap Number */ - unsigned int nosize[2]; - - /* Dynamic config support */ - - JK_CRIT_SEC cs; - /* should we forward potentially unsafe URLs */ - int reject_unsafe; - /* uriworkermap filename */ - const char *fname; - /* uriworkermap reload check interval */ - int reload; - /* Last modified time */ - time_t modified; - /* Last checked time */ - time_t checked; -}; -typedef struct jk_uri_worker_map jk_uri_worker_map_t; - -const char *uri_worker_map_get_source(uri_worker_record_t *uwr, jk_logger_t *l); - -char *uri_worker_map_get_match(uri_worker_record_t *uwr, char *buf, jk_logger_t *l); - -int uri_worker_map_alloc(jk_uri_worker_map_t **uw_map, - jk_map_t *init_data, jk_logger_t *l); - -int uri_worker_map_free(jk_uri_worker_map_t **uw_map, jk_logger_t *l); - -int uri_worker_map_open(jk_uri_worker_map_t *uw_map, - jk_map_t *init_data, jk_logger_t *l); - -void uri_worker_map_switch(jk_uri_worker_map_t *uw_map, jk_logger_t *l); - -void uri_worker_map_ext(jk_uri_worker_map_t *uw_map, jk_logger_t *l); - -int uri_worker_map_add(jk_uri_worker_map_t *uw_map, - const char *puri, const char *worker, - unsigned int source_type, jk_logger_t *l); - -const char *map_uri_to_worker(jk_uri_worker_map_t *uw_map, - const char *uri, const char *vhost, - jk_logger_t *l); - -const char *map_uri_to_worker_ext(jk_uri_worker_map_t *uw_map, - const char *uri, const char *vhost, - rule_extension_t **extensions, - int *index, - jk_logger_t *l); - -rule_extension_t *get_uri_to_worker_ext(jk_uri_worker_map_t *uw_map, - int index); - -int uri_worker_map_load(jk_uri_worker_map_t *uw_map, - jk_logger_t *l); - -int uri_worker_map_update(jk_uri_worker_map_t *uw_map, - int force, jk_logger_t *l); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* JK_URI_WORKER_MAP_H */ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.lo deleted file mode 100644 index 3d3b423a..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.lo +++ /dev/null @@ -1,12 +0,0 @@ -# jk_uri_worker_map.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/jk_uri_worker_map.o' - -# Name of the non-PIC object. -non_pic_object='jk_uri_worker_map.o' - diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.o deleted file mode 100644 index c402e1fc..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_url.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_url.c deleted file mode 100644 index 884f01d0..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_url.c +++ /dev/null @@ -1,124 +0,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. - */ - -/*************************************************************************** - * Description: URL manipulation subroutines. (ported from mod_proxy). * - * Version: $Revision: 531816 $ * - ***************************************************************************/ - -#include "jk_global.h" -#include "jk_url.h" - -#ifdef HAVE_APR -#define JK_ISXDIGIT(x) apr_isxdigit((x)) -#define JK_ISDIGIT(x) apr_isdigit((x)) -#define JK_ISUPPER(x) apr_isupper((x)) -#define JK_ISALNUM(x) apr_isalnum((x)) -#else -#define JK_ISXDIGIT(x) isxdigit((int)(unsigned char)((x))) -#define JK_ISDIGIT(x) isdigit((int)(unsigned char)((x))) -#define JK_ISUPPER(x) isupper((int)(unsigned char)((x))) -#define JK_ISALNUM(x) isalnum((int)(unsigned char)((x))) -#endif - -static void jk_c2hex(int ch, char *x) -{ -#if !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 /*CHARSET_EBCDIC*/ - static const char ntoa[] = { "0123456789ABCDEF" }; - char buf[1]; - - ch &= 0xFF; - - buf[0] = ch; - jk_xlate_to_ascii(buf, 1); - - x[0] = '%'; - x[1] = ntoa[(buf[0] >> 4) & 0x0F]; - x[2] = ntoa[buf[0] & 0x0F]; - x[3] = '\0'; -#endif /*CHARSET_EBCDIC*/ -} - -/* - * Convert a URL-encoded string to canonical form. - * It encodes those which must be encoded, and does not touch - * those which must not be touched. - * String x must be '\0'-terminated. - * String y must be pre-allocated with len maxlen - * (including the terminating '\0'). - */ -int jk_canonenc(const char *x, char *y, int maxlen) -{ - int i, j; - int ch = x[0]; - 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 - */ - allowed = "~$-_.+!*'(),;:@&="; - reserved = "/"; - - for (i = 0, j = 0; ch != '\0' && j < maxlen; i++, j++, ch=x[i]) { -/* always handle '/' first */ - if (strchr(reserved, ch)) { - y[j] = ch; - continue; - } -/* recode it, if necessary */ - if (!JK_ISALNUM(ch) && !strchr(allowed, ch)) { - if (j+2 * - * Author: Henri Gomez * - * Author: Rainer Jung * - * Version: $Revision: 1078846 $ * - ***************************************************************************/ - - -#include "jk_util.h" -#include "jk_ajp12_worker.h" -#include "jk_ajp13_worker.h" -#include "jk_ajp14_worker.h" -#include "jk_lb_worker.h" -#include "jk_mt.h" - -#define SYSPROPS_OF_WORKER ("sysprops") -#define STDERR_OF_WORKER ("stderr") -#define STDOUT_OF_WORKER ("stdout") -#define SECRET_OF_WORKER ("secret") -#define MX_OF_WORKER ("mx") -#define MS_OF_WORKER ("ms") -#define CP_OF_WORKER ("class_path") -#define BRIDGE_OF_WORKER ("bridge") -#define JVM_OF_WORKER ("jvm_lib") -#define LIBPATH_OF_WORKER ("ld_path") -#define CMD_LINE_OF_WORKER ("cmd_line") -#define NATIVE_LIB_OF_WORKER ("native_lib") -#define REFERENCE_OF_WORKER ("reference") -#define HOST_OF_WORKER ("host") -#define PORT_OF_WORKER ("port") -#define TYPE_OF_WORKER ("type") -#define CACHE_OF_WORKER_DEPRECATED ("cachesize") -#define CACHE_OF_WORKER ("connection_pool_size") -#define CACHE_OF_WORKER_MIN ("connection_pool_minsize") -#define CACHE_TIMEOUT_DEPRECATED ("cache_timeout") -#define CACHE_TIMEOUT_OF_WORKER ("connection_pool_timeout") -#define CACHE_ACQUIRE_OF_WORKER ("connection_acquire_timeout") -#define RECOVERY_OPTS_OF_WORKER ("recovery_options") -#define CONNECT_TIMEOUT_OF_WORKER ("connect_timeout") -#define PREPOST_TIMEOUT_OF_WORKER ("prepost_timeout") -#define REPLY_TIMEOUT_OF_WORKER ("reply_timeout") -#define SOCKET_TIMEOUT_OF_WORKER ("socket_timeout") -#define SOCKET_CONNECT_TIMEOUT_OF_WORKER ("socket_connect_timeout") -#define PING_TIMEOUT_OF_WORKER ("ping_timeout") -#define PING_MODE_OF_WORKER ("ping_mode") -#define SOCKET_BUFFER_OF_WORKER ("socket_buffer") -#define SOCKET_KEEPALIVE_OF_WORKER ("socket_keepalive") -#define CONN_PING_INTERVAL_OF_WORKER ("connection_ping_interval") -#define RECYCLE_TIMEOUT_DEPRECATED ("recycle_timeout") -#define LOAD_FACTOR_OF_WORKER ("lbfactor") -#define DISTANCE_OF_WORKER ("distance") -#define BALANCED_WORKERS_DEPRECATED ("balanced_workers") -#define BALANCE_WORKERS ("balance_workers") -#define STICKY_SESSION ("sticky_session") -#define STICKY_SESSION_FORCE ("sticky_session_force") -#define SESSION_COOKIE_OF_WORKER ("session_cookie") -#define SESSION_PATH_OF_WORKER ("session_path") - -#define LOCAL_WORKER_DEPRECATED ("local_worker") -#define LOCAL_WORKER_ONLY_DEPRECATED ("local_worker_only") -#define JVM_ROUTE_OF_WORKER_DEPRECATED ("jvm_route") -#define ROUTE_OF_WORKER ("route") -#define DOMAIN_OF_WORKER ("domain") -#define REDIRECT_OF_WORKER ("redirect") -#define MOUNT_OF_WORKER ("mount") -#define METHOD_OF_WORKER ("method") -#define LOCK_OF_WORKER ("lock") -#define IS_WORKER_DISABLED_DEPRECATED ("disabled") -#define IS_WORKER_STOPPED_DEPRECATED ("stopped") -#define ACTIVATION_OF_WORKER ("activation") -#define WORKER_RECOVER_TIME ("recover_time") -#define WORKER_ERROR_ESCALATION_TIME ("error_escalation_time") -#define MAX_REPLY_TIMEOUTS_OF_WORKER ("max_reply_timeouts") -#define RETRY_INTERVAL_OF_WORKER ("retry_interval") -#define WORKER_MAX_PACKET_SIZE ("max_packet_size") -#define STYLE_SHEET_OF_WORKER ("css") -#define NAMESPACE_OF_WORKER ("ns") -#define XML_NAMESPACE_OF_WORKER ("xmlns") -#define XML_DOCTYPE_OF_WORKER ("doctype") -#define PROP_PREFIX_OF_WORKER ("prefix") - -#define READ_ONLY_OF_WORKER ("read_only") -#define USER_OF_WORKER ("user") -#define USER_CASE_OF_WORKER ("user_case_insensitive") -#define GOOD_RATING_OF_WORKER ("good") -#define BAD_RATING_OF_WORKER ("bad") - -#define DEFAULT_WORKER_TYPE JK_AJP13_WORKER_NAME -#define SECRET_KEY_OF_WORKER ("secretkey") -#define RETRIES_OF_WORKER ("retries") -#define STATUS_FAIL_OF_WORKER ("fail_on_status") - -#define DEFAULT_WORKER JK_AJP13_WORKER_NAME -#define WORKER_LIST_PROPERTY_NAME ("worker.list") -#define LIST_PROPERTY_NAME ("list") -#define WORKER_MAINTAIN_PROPERTY_NAME ("worker.maintain") -#define MAINTAIN_PROPERTY_NAME ("maintain") -#define DEFAULT_MAINTAIN_TIME (60) -#define DEFAULT_LB_FACTOR (1) -#define DEFAULT_DISTANCE (0) - -#define TOMCAT32_BRIDGE_NAME ("tomcat32") -#define TOMCAT33_BRIDGE_NAME ("tomcat33") -#define TOMCAT40_BRIDGE_NAME ("tomcat40") -#define TOMCAT41_BRIDGE_NAME ("tomcat41") -#define TOMCAT50_BRIDGE_NAME ("tomcat5") - -#define HUGE_BUFFER_SIZE (8*1024) - -#define MAKE_WORKER_PARAM(P) \ - strcpy(buf, "worker."); \ - strcat(buf, wname); \ - strcat(buf, "."); \ - strcat(buf, P) - -/* - * define the log format, we're using by default the one from error.log - * - * [Mon Mar 26 19:44:48.123 2001] [jk_uri_worker_map.c (155)]: Into jk_uri_worker_map_t::uri_worker_map_alloc - * log format used by apache in error.log - */ -#define JK_TIME_CONV_MILLI "%Q" -#define JK_TIME_CONV_MICRO "%q" -#define JK_TIME_PATTERN_MILLI "000" -#define JK_TIME_PATTERN_MICRO "000000" -#define JK_TIME_FORMAT_NONE "[%a %b %d %H:%M:%S %Y] " -#define JK_TIME_FORMAT_MILLI "[%a %b %d %H:%M:%S." JK_TIME_CONV_MILLI " %Y] " -#define JK_TIME_FORMAT_MICRO "[%a %b %d %H:%M:%S." JK_TIME_CONV_MICRO " %Y] " -#define JK_TIME_SUBSEC_NONE (0) -#define JK_TIME_SUBSEC_MILLI (1) -#define JK_TIME_SUBSEC_MICRO (2) - -/* Visual C++ Toolkit 2003 support */ -#if defined (_MSC_VER) && (_MSC_VER == 1310) - extern long _ftol(double); /* defined by VC6 C libs */ - extern long _ftol2(double dblSource) { return _ftol(dblSource); } -#endif - -static const char *list_properties[] = { - BALANCE_WORKERS, - MOUNT_OF_WORKER, - USER_OF_WORKER, - GOOD_RATING_OF_WORKER, - BAD_RATING_OF_WORKER, - STATUS_FAIL_OF_WORKER, - "list", - NULL -}; - -static const char *unique_properties[] = { - SECRET_OF_WORKER, - REFERENCE_OF_WORKER, - HOST_OF_WORKER, - PORT_OF_WORKER, - TYPE_OF_WORKER, - CACHE_OF_WORKER_DEPRECATED, - CACHE_OF_WORKER, - CACHE_OF_WORKER_MIN, - CACHE_TIMEOUT_DEPRECATED, - CACHE_TIMEOUT_OF_WORKER, - CACHE_ACQUIRE_OF_WORKER, - RECOVERY_OPTS_OF_WORKER, - CONNECT_TIMEOUT_OF_WORKER, - PREPOST_TIMEOUT_OF_WORKER, - PING_TIMEOUT_OF_WORKER, - PING_MODE_OF_WORKER, - REPLY_TIMEOUT_OF_WORKER, - SOCKET_TIMEOUT_OF_WORKER, - SOCKET_CONNECT_TIMEOUT_OF_WORKER, - SOCKET_BUFFER_OF_WORKER, - SOCKET_KEEPALIVE_OF_WORKER, - CONN_PING_INTERVAL_OF_WORKER, - RECYCLE_TIMEOUT_DEPRECATED, - LOAD_FACTOR_OF_WORKER, - STICKY_SESSION, - STICKY_SESSION_FORCE, - SESSION_COOKIE_OF_WORKER, - SESSION_PATH_OF_WORKER, - LOCAL_WORKER_DEPRECATED, - LOCAL_WORKER_ONLY_DEPRECATED, - JVM_ROUTE_OF_WORKER_DEPRECATED, - ROUTE_OF_WORKER, - DOMAIN_OF_WORKER, - REDIRECT_OF_WORKER, - METHOD_OF_WORKER, - LOCK_OF_WORKER, - IS_WORKER_DISABLED_DEPRECATED, - IS_WORKER_STOPPED_DEPRECATED, - ACTIVATION_OF_WORKER, - WORKER_RECOVER_TIME, - WORKER_ERROR_ESCALATION_TIME, - MAX_REPLY_TIMEOUTS_OF_WORKER, - RETRY_INTERVAL_OF_WORKER, - WORKER_MAX_PACKET_SIZE, - STYLE_SHEET_OF_WORKER, - READ_ONLY_OF_WORKER, - RETRIES_OF_WORKER, - WORKER_MAINTAIN_PROPERTY_NAME, - NAMESPACE_OF_WORKER, - XML_NAMESPACE_OF_WORKER, - XML_DOCTYPE_OF_WORKER, - PROP_PREFIX_OF_WORKER, - USER_CASE_OF_WORKER, - NULL -}; - -static const char *deprecated_properties[] = { - SYSPROPS_OF_WORKER, - STDERR_OF_WORKER, - STDOUT_OF_WORKER, - MX_OF_WORKER, - MS_OF_WORKER, - CP_OF_WORKER, - BRIDGE_OF_WORKER, - JVM_OF_WORKER, - LIBPATH_OF_WORKER, - CMD_LINE_OF_WORKER, - NATIVE_LIB_OF_WORKER, - CACHE_OF_WORKER_DEPRECATED, - CACHE_TIMEOUT_DEPRECATED, - RECYCLE_TIMEOUT_DEPRECATED, - BALANCED_WORKERS_DEPRECATED, - JVM_ROUTE_OF_WORKER_DEPRECATED, - LOCAL_WORKER_DEPRECATED, - LOCAL_WORKER_ONLY_DEPRECATED, - IS_WORKER_DISABLED_DEPRECATED, - IS_WORKER_STOPPED_DEPRECATED, - NULL -}; - -static const char *supported_properties[] = { - SYSPROPS_OF_WORKER, - STDERR_OF_WORKER, - STDOUT_OF_WORKER, - SECRET_OF_WORKER, - MX_OF_WORKER, - MS_OF_WORKER, - CP_OF_WORKER, - BRIDGE_OF_WORKER, - JVM_OF_WORKER, - LIBPATH_OF_WORKER, - CMD_LINE_OF_WORKER, - NATIVE_LIB_OF_WORKER, - REFERENCE_OF_WORKER, - HOST_OF_WORKER, - PORT_OF_WORKER, - TYPE_OF_WORKER, - CACHE_OF_WORKER_DEPRECATED, - CACHE_OF_WORKER, - CACHE_OF_WORKER_MIN, - CACHE_TIMEOUT_DEPRECATED, - CACHE_TIMEOUT_OF_WORKER, - CACHE_ACQUIRE_OF_WORKER, - RECOVERY_OPTS_OF_WORKER, - CONNECT_TIMEOUT_OF_WORKER, - PREPOST_TIMEOUT_OF_WORKER, - PING_TIMEOUT_OF_WORKER, - PING_MODE_OF_WORKER, - REPLY_TIMEOUT_OF_WORKER, - SOCKET_TIMEOUT_OF_WORKER, - SOCKET_CONNECT_TIMEOUT_OF_WORKER, - SOCKET_BUFFER_OF_WORKER, - SOCKET_KEEPALIVE_OF_WORKER, - CONN_PING_INTERVAL_OF_WORKER, - RECYCLE_TIMEOUT_DEPRECATED, - LOAD_FACTOR_OF_WORKER, - DISTANCE_OF_WORKER, - BALANCED_WORKERS_DEPRECATED, - BALANCE_WORKERS, - STICKY_SESSION, - STICKY_SESSION_FORCE, - SESSION_COOKIE_OF_WORKER, - SESSION_PATH_OF_WORKER, - LOCAL_WORKER_DEPRECATED, - LOCAL_WORKER_ONLY_DEPRECATED, - JVM_ROUTE_OF_WORKER_DEPRECATED, - ROUTE_OF_WORKER, - DOMAIN_OF_WORKER, - REDIRECT_OF_WORKER, - MOUNT_OF_WORKER, - METHOD_OF_WORKER, - LOCK_OF_WORKER, - IS_WORKER_DISABLED_DEPRECATED, - IS_WORKER_STOPPED_DEPRECATED, - ACTIVATION_OF_WORKER, - WORKER_RECOVER_TIME, - WORKER_ERROR_ESCALATION_TIME, - MAX_REPLY_TIMEOUTS_OF_WORKER, - RETRY_INTERVAL_OF_WORKER, - WORKER_MAX_PACKET_SIZE, - STYLE_SHEET_OF_WORKER, - NAMESPACE_OF_WORKER, - XML_NAMESPACE_OF_WORKER, - XML_DOCTYPE_OF_WORKER, - PROP_PREFIX_OF_WORKER, - READ_ONLY_OF_WORKER, - USER_OF_WORKER, - USER_CASE_OF_WORKER, - GOOD_RATING_OF_WORKER, - BAD_RATING_OF_WORKER, - SECRET_KEY_OF_WORKER, - RETRIES_OF_WORKER, - STATUS_FAIL_OF_WORKER, - LIST_PROPERTY_NAME, - MAINTAIN_PROPERTY_NAME, - NULL -}; - -static const char *jk_level_verbs[] = { - "[" JK_LOG_TRACE_VERB "] ", - "[" JK_LOG_DEBUG_VERB "] ", - "[" JK_LOG_INFO_VERB "] ", - "[" JK_LOG_WARN_VERB "] ", - "[" JK_LOG_ERROR_VERB "] ", - "[" JK_LOG_EMERG_VERB "] ", - NULL -}; - -const char *jk_get_bool(int v) -{ - if (v == 0) - return "False"; - else - return "True"; -} - -int jk_get_bool_code(const char *v, int def) -{ - if (!v) { - return def; - } - else if (!strcasecmp(v, "off") || - *v == 'F' || *v == 'f' || - *v == 'N' || *v == 'n' || - (*v == '0' && *(v + 1) == '\0')) { - return 0; - } - else if (!strcasecmp(v, "on") || - *v == 'T' || *v == 't' || - *v == 'Y' || *v == 'y' || - (*v == '1' && *(v + 1) == '\0')) { - return 1; - } - return def; -} - -/* Sleep for 100ms */ -void jk_sleep(int ms) -{ -#ifdef OS2 - DosSleep(ms); -#elif defined(BEOS) - snooze(ms * 1000); -#elif defined(NETWARE) - delay(ms); -#elif defined(WIN32) - Sleep(ms); -#else - struct timeval tv; - tv.tv_usec = (ms % 1000) * 1000; - tv.tv_sec = ms / 1000; - select(0, NULL, NULL, NULL, &tv); -#endif -} - -/* Replace the first occurence of a sub second time format character - * by a series of zero digits with the right precision. - * We format our timestamp with strftime, but this can not handle - * sub second timestamps. - * So we first patch the milliseconds or microseconds literally into - * the format string, and then pass it on the strftime. - * In order to do that efficiently, we prepare a format string, that - * already has placeholder digits for the sub second time stamp - * and we save the position and time precision of this placeholder. - */ -void jk_set_time_fmt(jk_logger_t *l, const char *jk_log_fmt) -{ - if (l) { - char *s; - - if (!jk_log_fmt) { -#ifndef NO_GETTIMEOFDAY - jk_log_fmt = JK_TIME_FORMAT_MILLI; -#else - jk_log_fmt = JK_TIME_FORMAT_NONE; -#endif - } - l->log_fmt_type = JK_TIME_SUBSEC_NONE; - l->log_fmt_offset = 0; - l->log_fmt_size = 0; - l->log_fmt = jk_log_fmt; - -/* Look for the first occurence of JK_TIME_CONV_MILLI */ - if ((s = strstr(jk_log_fmt, JK_TIME_CONV_MILLI))) { - size_t offset = s - jk_log_fmt; - size_t len = strlen(JK_TIME_PATTERN_MILLI); - -/* If we don't have enough space in our fixed-length char array, - * we simply stick to the default format, ignoring JK_TIME_CONV_MILLI. - * Otherwise we replace the first occurence of JK_TIME_CONV_MILLI by JK_TIME_PATTERN_MILLI. - */ - if (offset + len < JK_TIME_MAX_SIZE) { - l->log_fmt_type = JK_TIME_SUBSEC_MILLI; - l->log_fmt_offset = offset; - strncpy(l->log_fmt_subsec, jk_log_fmt, offset); - strncpy(l->log_fmt_subsec + offset, JK_TIME_PATTERN_MILLI, len); - strncpy(l->log_fmt_subsec + offset + len, - s + strlen(JK_TIME_CONV_MILLI), - JK_TIME_MAX_SIZE - offset - len - 1); -/* Now we put a stop mark into the string to make it's length at most JK_TIME_MAX_SIZE-1 - * plus terminating '\0'. - */ - l->log_fmt_subsec[JK_TIME_MAX_SIZE-1] = '\0'; - l->log_fmt_size = strlen(l->log_fmt_subsec); - } -/* Look for the first occurence of JK_TIME_CONV_MICRO */ - } - else if ((s = strstr(jk_log_fmt, JK_TIME_CONV_MICRO))) { - size_t offset = s - jk_log_fmt; - size_t len = strlen(JK_TIME_PATTERN_MICRO); - -/* If we don't have enough space in our fixed-length char array, - * we simply stick to the default format, ignoring JK_TIME_CONV_MICRO. - * Otherwise we replace the first occurence of JK_TIME_CONV_MICRO by JK_TIME_PATTERN_MICRO. - */ - if (offset + len < JK_TIME_MAX_SIZE) { - l->log_fmt_type = JK_TIME_SUBSEC_MICRO; - l->log_fmt_offset = offset; - strncpy(l->log_fmt_subsec, jk_log_fmt, offset); - strncpy(l->log_fmt_subsec + offset, JK_TIME_PATTERN_MICRO, len); - strncpy(l->log_fmt_subsec + offset + len, - s + strlen(JK_TIME_CONV_MICRO), - JK_TIME_MAX_SIZE - offset - len - 1); -/* Now we put a stop mark into the string to make it's length at most JK_TIME_MAX_SIZE-1 - * plus terminating '\0'. - */ - l->log_fmt_subsec[JK_TIME_MAX_SIZE-1] = '\0'; - l->log_fmt_size = strlen(l->log_fmt_subsec); - } - } - jk_log(l, JK_LOG_DEBUG, "Pre-processed log time stamp format is '%s'", - l->log_fmt_type == JK_TIME_SUBSEC_NONE ? l->log_fmt : l->log_fmt_subsec); - } -} - -static int set_time_str(char *str, int len, jk_logger_t *l) -{ - time_t t; - struct tm *tms; -#ifdef _MT_CODE_PTHREAD - struct tm res; -#endif - int done; -/* We want to use a fixed maximum size buffer here. - * If we would dynamically adjust it to the real format - * string length, we could support longer format strings, - * but we would have to allocate and free for each log line. - */ - char log_fmt[JK_TIME_MAX_SIZE]; - - if (!l || !l->log_fmt) { - return 0; - } - - log_fmt[0] = '\0'; - -#ifndef NO_GETTIMEOFDAY - if ( l->log_fmt_type != JK_TIME_SUBSEC_NONE ) { - struct timeval tv; - int rc = 0; - -#ifdef WIN32 - gettimeofday(&tv, NULL); -#else - rc = gettimeofday(&tv, NULL); -#endif - if (rc == 0) { -/* We need this subsec buffer, because we convert - * the integer with sprintf(), but we don't - * want to write the terminating '\0' into our - * final log format string. - */ - char subsec[7]; - t = tv.tv_sec; - strncpy(log_fmt, l->log_fmt_subsec, l->log_fmt_size + 1); - if (l->log_fmt_type == JK_TIME_SUBSEC_MILLI) { - sprintf(subsec, "%03d", (int)(tv.tv_usec/1000)); - strncpy(log_fmt + l->log_fmt_offset, subsec, 3); - } - else if (l->log_fmt_type == JK_TIME_SUBSEC_MICRO) { - sprintf(subsec, "%06d", (int)(tv.tv_usec)); - strncpy(log_fmt + l->log_fmt_offset, subsec, 6); - } - } - else { - t = time(NULL); - } - } - else { - t = time(NULL); - } -#else - t = time(NULL); -#endif -#ifdef _MT_CODE_PTHREAD - tms = localtime_r(&t, &res); -#else - tms = localtime(&t); -#endif - if (log_fmt[0]) - done = (int)strftime(str, len, log_fmt, tms); - else - done = (int)strftime(str, len, l->log_fmt, tms); - return done; - -} - -static int JK_METHOD log_to_file(jk_logger_t *l, int level, int used, char *what) -{ - if (l && - (l->level <= level || level == JK_LOG_REQUEST_LEVEL) && - l->logger_private && what) { - jk_file_logger_t *p = l->logger_private; - if (p->logfile) { - what[used++] = '\n'; - what[used] = '\0'; -#if defined(JK_LOG_LOCKING) -#if defined(WIN32) && defined(_MSC_VER) - LockFile((HANDLE)_get_osfhandle(_fileno(p->logfile)), - 0, 0, 1, 0); -#endif -#endif - fputs(what, p->logfile); - /* [V] Flush the dam' thing! */ - fflush(p->logfile); -#if defined(JK_LOG_LOCKING) -#if defined(WIN32) && defined(_MSC_VER) - UnlockFile((HANDLE)_get_osfhandle(_fileno(p->logfile)), - 0, 0, 1, 0); -#endif -#endif - } - return JK_TRUE; - } - return JK_FALSE; -} - -int jk_parse_log_level(const char *level) -{ - if (0 == strcasecmp(level, JK_LOG_TRACE_VERB)) { - return JK_LOG_TRACE_LEVEL; - } - - if (0 == strcasecmp(level, JK_LOG_DEBUG_VERB)) { - return JK_LOG_DEBUG_LEVEL; - } - - if (0 == strcasecmp(level, JK_LOG_INFO_VERB)) { - return JK_LOG_INFO_LEVEL; - } - - if (0 == strcasecmp(level, JK_LOG_WARN_VERB)) { - return JK_LOG_WARNING_LEVEL; - } - - if (0 == strcasecmp(level, JK_LOG_ERROR_VERB)) { - return JK_LOG_ERROR_LEVEL; - } - - if (0 == strcasecmp(level, JK_LOG_EMERG_VERB)) { - return JK_LOG_EMERG_LEVEL; - } - - return JK_LOG_DEF_LEVEL; -} - -int jk_open_file_logger(jk_logger_t **l, const char *file, int level) -{ - if (l && file) { - - jk_logger_t *rc = (jk_logger_t *)malloc(sizeof(jk_logger_t)); - jk_file_logger_t *p = (jk_file_logger_t *) malloc(sizeof(jk_file_logger_t)); - if (rc && p) { - rc->log = log_to_file; - rc->level = level; - rc->logger_private = p; -#if defined(AS400) && !defined(AS400_UTF8) - p->logfile = fopen(file, "a+, o_ccsid=0"); -#elif defined(WIN32) && defined(_MSC_VER) - p->logfile = fopen(file, "a+c"); -#else - p->logfile = fopen(file, "a+"); -#endif - if (p->logfile) { - *l = rc; - jk_set_time_fmt(rc, NULL); - return JK_TRUE; - } - } - if (rc) { - free(rc); - } - if (p) { - free(p); - } - - *l = NULL; - } - return JK_FALSE; -} - -int jk_attach_file_logger(jk_logger_t **l, int fd, int level) -{ - if (l && fd >= 0) { - - jk_logger_t *rc = (jk_logger_t *)malloc(sizeof(jk_logger_t)); - jk_file_logger_t *p = (jk_file_logger_t *) malloc(sizeof(jk_file_logger_t)); - if (rc && p) { - rc->log = log_to_file; - rc->level = level; - rc->logger_private = p; -#if defined(AS400) && !defined(AS400_UTF8) - p->logfile = fdopen(fd, "a+, o_ccsid=0"); -#elif defined(WIN32) && defined(_MSC_VER) - p->logfile = fdopen(fd, "a+c"); -#else - p->logfile = fdopen(fd, "a+"); -#endif - if (p->logfile) { - *l = rc; - jk_set_time_fmt(rc, NULL); - return JK_TRUE; - } - } - if (rc) { - free(rc); - } - if (p) { - free(p); - } - - *l = NULL; - } - return JK_FALSE; -} - -int jk_close_file_logger(jk_logger_t **l) -{ - if (l && *l) { - jk_file_logger_t *p = (*l)->logger_private; - if (p) { - fflush(p->logfile); - fclose(p->logfile); - free(p); - } - free(*l); - *l = NULL; - - return JK_TRUE; - } - return JK_FALSE; -} - -int jk_log(jk_logger_t *l, - const char *file, int line, const char *funcname, int level, - const char *fmt, ...) -{ - int rc = 0; - /* - * Need to reserve space for terminating zero byte - * and platform specific line endings added during the call - * to the output routing. - */ - static int usable_size = HUGE_BUFFER_SIZE - 3; - if (!l || !file || !fmt) { - return -1; - } - - if ((l->level <= level) || (level == JK_LOG_REQUEST_LEVEL)) { -#ifdef NETWARE - /* On NetWare, this can get called on a thread that has a limited stack so */ - /* we will allocate and free the temporary buffer in this function */ - char *buf; -#else - char buf[HUGE_BUFFER_SIZE]; -#endif - char *f = (char *)(file + strlen(file) - 1); - va_list args; - int used = 0; - - while (f != file && '\\' != *f && '/' != *f) { - f--; - } - if (f != file) { - f++; - } - -#ifdef NETWARE - buf = (char *)malloc(HUGE_BUFFER_SIZE); - if (NULL == buf) - return -1; -#endif - used = set_time_str(buf, usable_size, l); - - if (line) { /* line==0 only used for request log item */ - /* Log [pid:threadid] for all levels except REQUEST. */ - /* This information helps to correlate lines from different logs. */ - /* Performance is no issue, because with production log levels */ - /* we only call it often, if we have a lot of errors */ - rc = snprintf(buf + used, usable_size - used, - "[%" JK_PID_T_FMT ":%" JK_PTHREAD_T_FMT "] ", getpid(), jk_gettid()); - used += rc; - if (rc < 0 ) { - return 0; - } - - rc = (int)strlen(jk_level_verbs[level]); - if (usable_size - used >= rc) { - strncpy(buf + used, jk_level_verbs[level], rc); - used += rc; - } - else { - return 0; /* [V] not sure what to return... */ - } - - if (funcname) { - rc = (int)strlen(funcname); - if (usable_size - used >= rc + 2) { - strncpy(buf + used, funcname, rc); - used += rc; - strncpy(buf + used, "::", 2); - used += 2; - } - else { - return 0; /* [V] not sure what to return... */ - } - } - - rc = (int)strlen(f); - if (usable_size - used >= rc) { - strncpy(buf + used, f, rc); - used += rc; - } - else { - return 0; /* [V] not sure what to return... */ - } - - rc = snprintf(buf + used, usable_size - used, - " (%d): ", line); - used += rc; - if (rc < 0 || usable_size - used < 0) { - return 0; /* [V] not sure what to return... */ - } - } - - va_start(args, fmt); - rc = vsnprintf(buf + used, usable_size - used, fmt, args); - va_end(args); - if ( rc <= usable_size - used ) { - used += rc; - } else { - used = usable_size; - } - l->log(l, level, used, buf); - -#ifdef NETWARE - free(buf); -#endif - } - - return rc; -} - -const char *jk_get_worker_type(jk_map_t *m, const char *wname) -{ - char buf[1024]; - - if (!m || !wname) { - return NULL; - } - MAKE_WORKER_PARAM(TYPE_OF_WORKER); - return jk_map_get_string(m, buf, DEFAULT_WORKER_TYPE); -} - -const char *jk_get_worker_route(jk_map_t *m, const char *wname, const char *def) -{ - char buf[1024]; - const char *v; - if (!m || !wname) { - return NULL; - } - MAKE_WORKER_PARAM(ROUTE_OF_WORKER); - v = jk_map_get_string(m, buf, NULL); - if (v) { - return v; - } - /* Try old jvm_route directive */ - MAKE_WORKER_PARAM(JVM_ROUTE_OF_WORKER_DEPRECATED); - return jk_map_get_string(m, buf, def); -} - -const char *jk_get_worker_domain(jk_map_t *m, const char *wname, const char *def) -{ - char buf[1024]; - if (!m || !wname) { - return NULL; - } - MAKE_WORKER_PARAM(DOMAIN_OF_WORKER); - return jk_map_get_string(m, buf, def); -} - -const char *jk_get_worker_redirect(jk_map_t *m, const char *wname, const char *def) -{ - char buf[1024]; - if (!m || !wname) { - return NULL; - } - MAKE_WORKER_PARAM(REDIRECT_OF_WORKER); - return jk_map_get_string(m, buf, def); -} - -const char *jk_get_worker_secret(jk_map_t *m, const char *wname) -{ - char buf[1024]; - - if (!m || !wname) { - return NULL; - } - - MAKE_WORKER_PARAM(SECRET_OF_WORKER); - - return jk_map_get_string(m, buf, NULL); -} - -/* [V] I suggest that the following general purpose functions be used. */ -/* More should be added (double etc.), but now these were enough for me. */ -/* Functions that can be simulated with these should be "deprecated". */ - -int jk_get_worker_str_prop(jk_map_t *m, - const char *wname, const char *pname, const char **prop) -{ - char buf[1024]; - - if (m && prop && wname && pname) { - MAKE_WORKER_PARAM(pname); - *prop = jk_map_get_string(m, buf, NULL); - if (*prop) { - return JK_TRUE; - } - } - return JK_FALSE; -} - -int jk_get_worker_int_prop(jk_map_t *m, - const char *wname, const char *pname, int *prop) -{ - char buf[1024]; - - if (m && prop && wname && pname) { - int i; - MAKE_WORKER_PARAM(pname); - i = jk_map_get_int(m, buf, -1); - if (-1 != i) { - *prop = i; - return JK_TRUE; - } - } - return JK_FALSE; -} - -const char *jk_get_worker_host(jk_map_t *m, const char *wname, const char *def) -{ - char buf[1024]; - - if (!m || !wname) { - return NULL; - } - - MAKE_WORKER_PARAM(HOST_OF_WORKER); - - return jk_map_get_string(m, buf, def); -} - -int jk_get_worker_port(jk_map_t *m, const char *wname, int def) -{ - char buf[1024]; - - if (!m || !wname) { - return -1; - } - - MAKE_WORKER_PARAM(PORT_OF_WORKER); - - return jk_map_get_int(m, buf, def); -} - -static int def_cache_size = -1; -int jk_get_worker_def_cache_size(int protocol) -{ - if (def_cache_size < 1) { - if (protocol == AJP14_PROTO) - def_cache_size = AJP14_DEF_CACHE_SZ; - else - def_cache_size = AJP13_DEF_CACHE_SZ; - } - return def_cache_size; -} - -void jk_set_worker_def_cache_size(int sz) -{ - def_cache_size = sz; -} - -int jk_get_worker_cache_size(jk_map_t *m, const char *wname, int def) -{ - char buf[1024]; - int rv; - - if (!m || !wname) { - return -1; - } - - MAKE_WORKER_PARAM(CACHE_OF_WORKER); - if ((rv = jk_map_get_int(m, buf, -1)) >= 0) - return rv; - MAKE_WORKER_PARAM(CACHE_OF_WORKER_DEPRECATED); - return jk_map_get_int(m, buf, def); -} - -int jk_get_worker_cache_size_min(jk_map_t *m, const char *wname, int def) -{ - char buf[1024]; - - if (!m || !wname) { - return -1; - } - - MAKE_WORKER_PARAM(CACHE_OF_WORKER_MIN); - return jk_map_get_int(m, buf, def); -} - -int jk_get_worker_cache_acquire_timeout(jk_map_t *m, const char *wname, int def) -{ - char buf[1024]; - - if (!m || !wname) { - return -1; - } - - MAKE_WORKER_PARAM(CACHE_ACQUIRE_OF_WORKER); - return jk_map_get_int(m, buf, def); -} - -int jk_get_worker_socket_timeout(jk_map_t *m, const char *wname, int def) -{ - char buf[1024]; - - if (!m || !wname) { - return -1; - } - - MAKE_WORKER_PARAM(SOCKET_TIMEOUT_OF_WORKER); - - return jk_map_get_int(m, buf, def); -} - -int jk_get_worker_socket_connect_timeout(jk_map_t *m, const char *wname, int def) -{ - char buf[1024]; - - if (!m || !wname) { - return -1; - } - - MAKE_WORKER_PARAM(SOCKET_CONNECT_TIMEOUT_OF_WORKER); - - return jk_map_get_int(m, buf, def); -} - -int jk_get_worker_recover_timeout(jk_map_t *m, const char *wname, int def) -{ - char buf[1024]; - - if (!m || !wname) { - return -1; - } - - MAKE_WORKER_PARAM(WORKER_RECOVER_TIME); - - return jk_map_get_int(m, buf, def); -} - -int jk_get_worker_error_escalation_time(jk_map_t *m, const char *wname, int def) -{ - char buf[1024]; - - if (!m || !wname) { - return -1; - } - - MAKE_WORKER_PARAM(WORKER_ERROR_ESCALATION_TIME); - - return jk_map_get_int(m, buf, def); -} - -int jk_get_worker_max_reply_timeouts(jk_map_t *m, const char *wname, int def) -{ - char buf[1024]; - - if (!m || !wname) { - return -1; - } - - MAKE_WORKER_PARAM(MAX_REPLY_TIMEOUTS_OF_WORKER); - - return jk_map_get_int(m, buf, def); -} - -int jk_get_worker_retry_interval(jk_map_t *m, const char *wname, int def) -{ - char buf[1024]; - - if (!m || !wname) { - return -1; - } - - MAKE_WORKER_PARAM(RETRY_INTERVAL_OF_WORKER); - - return jk_map_get_int(m, buf, def); -} - -int jk_get_worker_socket_buffer(jk_map_t *m, const char *wname, int def) -{ - char buf[1024]; - int i; - if (!m || !wname) { - return -1; - } - - MAKE_WORKER_PARAM(SOCKET_BUFFER_OF_WORKER); - - i = jk_map_get_int(m, buf, 0); - if (i > 0 && i < def) - i = def; - return i; -} - -int jk_get_worker_socket_keepalive(jk_map_t *m, const char *wname, int def) -{ - char buf[1024]; - - if (!m || !wname) { - return -1; - } - - MAKE_WORKER_PARAM(SOCKET_KEEPALIVE_OF_WORKER); - - return jk_map_get_bool(m, buf, def); -} - -int jk_get_worker_conn_ping_interval(jk_map_t *m, const char *wname, int def) -{ - char buf[1024]; - - if (!m || !wname) { - return -1; - } - - MAKE_WORKER_PARAM(CONN_PING_INTERVAL_OF_WORKER); - - return jk_map_get_int(m, buf, def); -} - -int jk_get_worker_cache_timeout(jk_map_t *m, const char *wname, int def) -{ - char buf[1024]; - int rv; - - if (!m || !wname) { - return -1; - } - - MAKE_WORKER_PARAM(CACHE_TIMEOUT_OF_WORKER); - if ((rv = jk_map_get_int(m, buf, -1)) >= 0) - return rv; - MAKE_WORKER_PARAM(CACHE_TIMEOUT_DEPRECATED); - - return jk_map_get_int(m, buf, def); -} - -int jk_get_worker_connect_timeout(jk_map_t *m, const char *wname, int def) -{ - char buf[1024]; - - if (!m || !wname) { - return -1; - } - - MAKE_WORKER_PARAM(CONNECT_TIMEOUT_OF_WORKER); - - return jk_map_get_int(m, buf, def); -} - -int jk_get_worker_prepost_timeout(jk_map_t *m, const char *wname, int def) -{ - char buf[1024]; - - if (!m || !wname) { - return -1; - } - - MAKE_WORKER_PARAM(PREPOST_TIMEOUT_OF_WORKER); - - return jk_map_get_int(m, buf, def); -} - -int jk_get_worker_ping_timeout(jk_map_t *m, const char *wname, int def) -{ - char buf[1024]; - - if (!m || !wname) { - return -1; - } - - MAKE_WORKER_PARAM(PING_TIMEOUT_OF_WORKER); - - return jk_map_get_int(m, buf, def); -} - -int jk_get_worker_ping_mode(jk_map_t *m, const char *wname, int def) -{ - char buf[1024]; - const char *v; - - if (!m || !wname) { - return def; - } - - MAKE_WORKER_PARAM(PING_MODE_OF_WORKER); - - v = jk_map_get_string(m, buf, NULL); - return jk_ajp_get_cping_mode(v, def); -} - -int jk_get_worker_reply_timeout(jk_map_t *m, const char *wname, int def) -{ - char buf[1024]; - - if (!m || !wname) { - return -1; - } - - MAKE_WORKER_PARAM(REPLY_TIMEOUT_OF_WORKER); - - return jk_map_get_int(m, buf, def); -} - -int jk_get_worker_recycle_timeout(jk_map_t *m, const char *wname, int def) -{ - return def; -} - -int jk_get_worker_retries(jk_map_t *m, const char *wname, int def) -{ - char buf[1024]; - int rv; - if (!m || !wname) { - return -1; - } - - MAKE_WORKER_PARAM(RETRIES_OF_WORKER); - - rv = jk_map_get_int(m, buf, def); - if (rv < 1) - rv = 1; - - return rv; -} - -int jk_get_worker_recovery_opts(jk_map_t *m, const char *wname, int def) -{ - char buf[1024]; - - if (!m || !wname) { - return -1; - } - - MAKE_WORKER_PARAM(RECOVERY_OPTS_OF_WORKER); - - return jk_map_get_int(m, buf, def); -} - -const char *jk_get_worker_secret_key(jk_map_t *m, const char *wname) -{ - char buf[1024]; - - if (!m || !wname) { - return NULL; - } - - MAKE_WORKER_PARAM(SECRET_KEY_OF_WORKER); - return jk_map_get_string(m, buf, NULL); -} - -int jk_get_worker_list(jk_map_t *m, char ***list, unsigned *num_of_workers) -{ - if (m && list && num_of_workers) { - char **ar = jk_map_get_string_list(m, - WORKER_LIST_PROPERTY_NAME, - num_of_workers, - DEFAULT_WORKER); - if (ar) { - *list = ar; - return JK_TRUE; - } - *list = NULL; - *num_of_workers = 0; - } - - return JK_FALSE; -} - -int jk_get_is_worker_disabled(jk_map_t *m, const char *wname) -{ - int rc = JK_TRUE; - char buf[1024]; - if (m && wname) { - int value; - MAKE_WORKER_PARAM(IS_WORKER_DISABLED_DEPRECATED); - value = jk_map_get_bool(m, buf, 0); - if (!value) - rc = JK_FALSE; - } - return rc; -} - -int jk_get_is_worker_stopped(jk_map_t *m, const char *wname) -{ - int rc = JK_TRUE; - char buf[1024]; - if (m && wname) { - int value; - MAKE_WORKER_PARAM(IS_WORKER_STOPPED_DEPRECATED); - value = jk_map_get_bool(m, buf, 0); - if (!value) - rc = JK_FALSE; - } - return rc; -} - -int jk_get_worker_activation(jk_map_t *m, const char *wname) -{ - char buf[1024]; - const char *v; - if (!m || !wname) { - return JK_LB_ACTIVATION_ACTIVE; - } - - MAKE_WORKER_PARAM(ACTIVATION_OF_WORKER); - v = jk_map_get_string(m, buf, NULL); - if (v) { - return jk_lb_get_activation_code(v); - } - else if (jk_get_is_worker_stopped(m, wname)) - return JK_LB_ACTIVATION_STOPPED; - else if (jk_get_is_worker_disabled(m, wname)) - return JK_LB_ACTIVATION_DISABLED; - else - return JK_LB_ACTIVATION_DEF; -} - -int jk_get_lb_factor(jk_map_t *m, const char *wname) -{ - char buf[1024]; - - if (!m || !wname) { - return DEFAULT_LB_FACTOR; - } - - MAKE_WORKER_PARAM(LOAD_FACTOR_OF_WORKER); - - return jk_map_get_int(m, buf, DEFAULT_LB_FACTOR); -} - -int jk_get_distance(jk_map_t *m, const char *wname) -{ - char buf[1024]; - - if (!m || !wname) { - return DEFAULT_DISTANCE; - } - - MAKE_WORKER_PARAM(DISTANCE_OF_WORKER); - - return jk_map_get_int(m, buf, DEFAULT_DISTANCE); -} - -int jk_get_is_sticky_session(jk_map_t *m, const char *wname) -{ - int rc = JK_TRUE; - char buf[1024]; - if (m && wname) { - int value; - MAKE_WORKER_PARAM(STICKY_SESSION); - value = jk_map_get_bool(m, buf, 1); - if (!value) - rc = JK_FALSE; - } - return rc; -} - -int jk_get_is_sticky_session_force(jk_map_t *m, const char *wname) -{ - int rc = JK_FALSE; - char buf[1024]; - if (m && wname) { - int value; - MAKE_WORKER_PARAM(STICKY_SESSION_FORCE); - value = jk_map_get_bool(m, buf, 0); - if (value) - rc = JK_TRUE; - } - return rc; -} - -int jk_get_lb_method(jk_map_t *m, const char *wname) -{ - char buf[1024]; - const char *v; - if (!m || !wname) { - return JK_LB_METHOD_DEF; - } - - MAKE_WORKER_PARAM(METHOD_OF_WORKER); - v = jk_map_get_string(m, buf, NULL); - return jk_lb_get_method_code(v); -} - -int jk_get_lb_lock(jk_map_t *m, const char *wname) -{ - char buf[1024]; - const char *v; - if (!m || !wname) { - return JK_LB_LOCK_DEF; - } - - MAKE_WORKER_PARAM(LOCK_OF_WORKER); - v = jk_map_get_string(m, buf, NULL); - return jk_lb_get_lock_code(v); -} - -int jk_get_max_packet_size(jk_map_t *m, const char *wname) -{ - char buf[1024]; - int sz; - - if (!m || !wname) { - return DEF_BUFFER_SZ; - } - - MAKE_WORKER_PARAM(WORKER_MAX_PACKET_SIZE); - sz = jk_map_get_int(m, buf, DEF_BUFFER_SZ); - sz = JK_ALIGN(sz, 1024); - if (sz < DEF_BUFFER_SZ) - sz = DEF_BUFFER_SZ; - else if (sz > 64*1024) - sz = 64*1024; - - return sz; -} - -int jk_get_worker_fail_on_status(jk_map_t *m, const char *wname, - int *list, unsigned int list_size) -{ - char buf[1024]; - if (!m || !wname || !list) { - return 0; - } - MAKE_WORKER_PARAM(STATUS_FAIL_OF_WORKER); - if (list_size) { - return jk_map_get_int_list(m, buf, - list, list_size, - NULL); - } - - return 0; -} - -int jk_get_worker_user_case_insensitive(jk_map_t *m, const char *wname) -{ - int rc = JK_FALSE; - char buf[1024]; - if (m && wname) { - int value; - MAKE_WORKER_PARAM(USER_CASE_OF_WORKER); - value = jk_map_get_bool(m, buf, 0); - if (value) - rc = JK_TRUE; - } - return rc; - -} - -const char *jk_get_worker_style_sheet(jk_map_t *m, const char *wname, const char *def) -{ - char buf[1024]; - - if (!m || !wname) { - return NULL; - } - - MAKE_WORKER_PARAM(STYLE_SHEET_OF_WORKER); - - return jk_map_get_string(m, buf, def); -} - -const char *jk_get_worker_name_space(jk_map_t *m, const char *wname, const char *def) -{ - const char *rc; - char buf[1024]; - if (!m || !wname) { - return NULL; - } - MAKE_WORKER_PARAM(NAMESPACE_OF_WORKER); - rc = jk_map_get_string(m, buf, def); - if (*rc == '-') - return ""; - else - return rc; -} - -const char *jk_get_worker_xmlns(jk_map_t *m, const char *wname, const char *def) -{ - const char *rc; - char buf[1024]; - if (!m || !wname) { - return NULL; - } - MAKE_WORKER_PARAM(XML_NAMESPACE_OF_WORKER); - rc = jk_map_get_string(m, buf, def); - if (*rc == '-') - return ""; - else - return rc; -} - -const char *jk_get_worker_xml_doctype(jk_map_t *m, const char *wname, const char *def) -{ - char buf[1024]; - if (!m || !wname) { - return NULL; - } - MAKE_WORKER_PARAM(XML_DOCTYPE_OF_WORKER); - return jk_map_get_string(m, buf, def); -} - -const char *jk_get_worker_prop_prefix(jk_map_t *m, const char *wname, const char *def) -{ - char buf[1024]; - if (!m || !wname) { - return NULL; - } - MAKE_WORKER_PARAM(PROP_PREFIX_OF_WORKER); - return jk_map_get_string(m, buf, def); -} - -int jk_get_is_read_only(jk_map_t *m, const char *wname) -{ - int rc = JK_FALSE; - char buf[1024]; - if (m && wname) { - int value; - MAKE_WORKER_PARAM(READ_ONLY_OF_WORKER); - value = jk_map_get_bool(m, buf, 0); - if (value) - rc = JK_TRUE; - } - return rc; -} - -int jk_get_worker_user_list(jk_map_t *m, - const char *wname, - char ***list, unsigned int *num) -{ - char buf[1024]; - - if (m && list && num && wname) { - char **ar = NULL; - - MAKE_WORKER_PARAM(USER_OF_WORKER); - ar = jk_map_get_string_list(m, buf, num, NULL); - if (ar) { - *list = ar; - return JK_TRUE; - } - *list = NULL; - *num = 0; - } - - return JK_FALSE; -} - -int jk_get_worker_good_rating(jk_map_t *m, - const char *wname, - char ***list, unsigned int *num) -{ - char buf[1024]; - - if (m && list && num && wname) { - char **ar = NULL; - - MAKE_WORKER_PARAM(GOOD_RATING_OF_WORKER); - ar = jk_map_get_string_list(m, buf, num, NULL); - if (ar) { - *list = ar; - return JK_TRUE; - } - *list = NULL; - *num = 0; - } - - return JK_FALSE; -} - -int jk_get_worker_bad_rating(jk_map_t *m, - const char *wname, - char ***list, unsigned int *num) -{ - char buf[1024]; - - if (m && list && num && wname) { - char **ar = NULL; - - MAKE_WORKER_PARAM(BAD_RATING_OF_WORKER); - ar = jk_map_get_string_list(m, buf, num, NULL); - if (ar) { - *list = ar; - return JK_TRUE; - } - *list = NULL; - *num = 0; - } - - return JK_FALSE; -} - -int jk_get_lb_worker_list(jk_map_t *m, - const char *wname, - char ***list, unsigned int *num_of_workers) -{ - char buf[1024]; - - if (m && list && num_of_workers && wname) { - char **ar = NULL; - - MAKE_WORKER_PARAM(BALANCE_WORKERS); - ar = jk_map_get_string_list(m, buf, num_of_workers, NULL); - if (ar) { - *list = ar; - return JK_TRUE; - } - /* Try old balanced_workers directive */ - MAKE_WORKER_PARAM(BALANCED_WORKERS_DEPRECATED); - ar = jk_map_get_string_list(m, buf, num_of_workers, NULL); - if (ar) { - *list = ar; - return JK_TRUE; - } - *list = NULL; - *num_of_workers = 0; - } - - return JK_FALSE; -} - -int jk_get_worker_mount_list(jk_map_t *m, - const char *wname, - char ***list, unsigned int *num_of_maps) -{ - char buf[1024]; - - if (m && list && num_of_maps && wname) { - char **ar = NULL; - - MAKE_WORKER_PARAM(MOUNT_OF_WORKER); - ar = jk_map_get_string_list(m, buf, num_of_maps, NULL); - if (ar) { - *list = ar; - return JK_TRUE; - } - *list = NULL; - *num_of_maps = 0; - } - - return JK_FALSE; -} - -int jk_get_worker_maintain_time(jk_map_t *m) -{ - return jk_map_get_int(m, WORKER_MAINTAIN_PROPERTY_NAME, - DEFAULT_MAINTAIN_TIME); -} - -int jk_get_worker_mx(jk_map_t *m, const char *wname, unsigned *mx) -{ - char buf[1024]; - - if (m && mx && wname) { - int i; - MAKE_WORKER_PARAM(MX_OF_WORKER); - - i = jk_map_get_int(m, buf, -1); - if (-1 != i) { - *mx = (unsigned)i; - return JK_TRUE; - } - } - - return JK_FALSE; -} - -int jk_get_worker_ms(jk_map_t *m, const char *wname, unsigned *ms) -{ - char buf[1024]; - - if (m && ms && wname) { - int i; - MAKE_WORKER_PARAM(MS_OF_WORKER); - - i = jk_map_get_int(m, buf, -1); - if (-1 != i) { - *ms = (unsigned)i; - return JK_TRUE; - } - } - - return JK_FALSE; -} - -int jk_get_worker_classpath(jk_map_t *m, const char *wname, const char **cp) -{ - char buf[1024]; - - if (m && cp && wname) { - MAKE_WORKER_PARAM(CP_OF_WORKER); - - *cp = jk_map_get_string(m, buf, NULL); - if (*cp) { - return JK_TRUE; - } - } - - return JK_FALSE; -} - -int jk_get_worker_bridge_type(jk_map_t *m, const char *wname, unsigned *bt) -{ - char buf[1024]; - const char *type; - - if (m && bt && wname) { - MAKE_WORKER_PARAM(BRIDGE_OF_WORKER); - - type = jk_map_get_string(m, buf, NULL); - - if (type) { - if (!strcasecmp(type, TOMCAT32_BRIDGE_NAME)) - *bt = TC32_BRIDGE_TYPE; - else if (!strcasecmp(type, TOMCAT33_BRIDGE_NAME)) - *bt = TC33_BRIDGE_TYPE; - else if (!strcasecmp(type, TOMCAT40_BRIDGE_NAME)) - *bt = TC40_BRIDGE_TYPE; - else if (!strcasecmp(type, TOMCAT41_BRIDGE_NAME)) - *bt = TC41_BRIDGE_TYPE; - else if (!strcasecmp(type, TOMCAT50_BRIDGE_NAME)) - *bt = TC50_BRIDGE_TYPE; - - return JK_TRUE; - } - } - - return JK_FALSE; -} - -int jk_get_worker_jvm_path(jk_map_t *m, const char *wname, const char **vm_path) -{ - char buf[1024]; - - if (m && vm_path && wname) { - MAKE_WORKER_PARAM(JVM_OF_WORKER); - - *vm_path = jk_map_get_string(m, buf, NULL); - if (*vm_path) { - return JK_TRUE; - } - } - - return JK_FALSE; -} - -/* [V] This is unused. currently. */ -int jk_get_worker_callback_dll(jk_map_t *m, const char *wname, const char **cb_path) -{ - char buf[1024]; - - if (m && cb_path && wname) { - MAKE_WORKER_PARAM(NATIVE_LIB_OF_WORKER); - - *cb_path = jk_map_get_string(m, buf, NULL); - if (*cb_path) { - return JK_TRUE; - } - } - - return JK_FALSE; -} - -int jk_get_worker_cmd_line(jk_map_t *m, const char *wname, const char **cmd_line) -{ - char buf[1024]; - - if (m && cmd_line && wname) { - MAKE_WORKER_PARAM(CMD_LINE_OF_WORKER); - - *cmd_line = jk_map_get_string(m, buf, NULL); - if (*cmd_line) { - return JK_TRUE; - } - } - - return JK_FALSE; -} - - -int jk_stat(const char *f, struct stat * statbuf) -{ - int rc; -/** - * i5/OS V5R4 expect filename in ASCII for fopen but required them in EBCDIC for stat() - */ -#ifdef AS400_UTF8 - char *ptr; - - ptr = (char *)malloc(strlen(f) + 1); - jk_ascii2ebcdic((char *)f, ptr); - rc = stat(ptr, statbuf); - free(ptr); -#else - rc = stat(f, statbuf); -#endif - - return (rc); -} - - -int jk_file_exists(const char *f) -{ - if (f) { - struct stat st; - - if ((0 == jk_stat(f, &st)) && (st.st_mode & S_IFREG)) - return JK_TRUE; - } - - return JK_FALSE; -} - -static int jk_is_some_property(const char *prp_name, const char *suffix, const char *sep) -{ - char buf[1024]; - - if (prp_name && suffix) { - size_t prp_name_len; - size_t suffix_len; - strcpy(buf, sep); - strcat(buf, suffix); - prp_name_len = strlen(prp_name); - suffix_len = strlen(buf); - if (prp_name_len >= suffix_len) { - const char *prp_suffix = prp_name + prp_name_len - suffix_len; - if (0 == strcmp(buf, prp_suffix)) { - return JK_TRUE; - } - } - } - - return JK_FALSE; -} - -int jk_is_path_property(const char *prp_name) -{ - return jk_is_some_property(prp_name, "path", "_"); -} - -int jk_is_cmd_line_property(const char *prp_name) -{ - return jk_is_some_property(prp_name, CMD_LINE_OF_WORKER, "."); -} - -int jk_is_list_property(const char *prp_name) -{ - const char **props = &list_properties[0]; - while (*props) { - if (jk_is_some_property(prp_name, *props, ".")) - return JK_TRUE; - props++; - } - return JK_FALSE; -} - -int jk_is_unique_property(const char *prp_name) -{ - const char **props = &unique_properties[0]; - while (*props) { - if (jk_is_some_property(prp_name, *props, ".")) - return JK_TRUE; - props++; - } - return JK_FALSE; -} - -int jk_is_deprecated_property(const char *prp_name) -{ - const char **props = &deprecated_properties[0]; - while (*props) { - if (jk_is_some_property(prp_name, *props, ".")) - return JK_TRUE; - props++; - } - return JK_FALSE; -} -/* - * Check that property is a valid one (to prevent user typos). - * Only property starting with worker. - */ -int jk_is_valid_property(const char *prp_name) -{ - const char **props; - if (memcmp(prp_name, "worker.", 7)) - return JK_TRUE; - - props = &supported_properties[0]; - while (*props) { - if (jk_is_some_property(prp_name, *props, ".")) - return JK_TRUE; - props++; - } - return JK_FALSE; -} - -int jk_get_worker_stdout(jk_map_t *m, const char *wname, const char **stdout_name) -{ - char buf[1024]; - - if (m && stdout_name && wname) { - MAKE_WORKER_PARAM(STDOUT_OF_WORKER); - - *stdout_name = jk_map_get_string(m, buf, NULL); - if (*stdout_name) { - return JK_TRUE; - } - } - - return JK_FALSE; -} - -int jk_get_worker_stderr(jk_map_t *m, const char *wname, const char **stderr_name) -{ - char buf[1024]; - - if (m && stderr_name && wname) { - MAKE_WORKER_PARAM(STDERR_OF_WORKER); - - *stderr_name = jk_map_get_string(m, buf, NULL); - if (*stderr_name) { - return JK_TRUE; - } - } - - return JK_FALSE; -} - -int jk_get_worker_sysprops(jk_map_t *m, const char *wname, const char **sysprops) -{ - char buf[1024]; - - if (m && sysprops && wname) { - MAKE_WORKER_PARAM(SYSPROPS_OF_WORKER); - - *sysprops = jk_map_get_string(m, buf, NULL); - if (*sysprops) { - return JK_TRUE; - } - } - - return JK_FALSE; -} - -int jk_get_worker_libpath(jk_map_t *m, const char *wname, const char **libpath) -{ - char buf[1024]; - - if (m && libpath && wname) { - MAKE_WORKER_PARAM(LIBPATH_OF_WORKER); - - *libpath = jk_map_get_string(m, buf, NULL); - if (*libpath) { - return JK_TRUE; - } - } - - return JK_FALSE; -} - -const char *jk_get_lb_session_cookie(jk_map_t *m, const char *wname, const char *def) -{ - char buf[1024]; - if (!m || !wname) { - return NULL; - } - MAKE_WORKER_PARAM(SESSION_COOKIE_OF_WORKER); - return jk_map_get_string(m, buf, def); -} - -const char *jk_get_lb_session_path(jk_map_t *m, const char *wname, const char *def) -{ - char buf[1024]; - if (!m || !wname) { - return NULL; - } - MAKE_WORKER_PARAM(SESSION_PATH_OF_WORKER); - return jk_map_get_string(m, buf, def); -} - - -int is_http_status_fail(unsigned int http_status_fail_num, - int *http_status_fail, int status) -{ - unsigned int i; - int soft_status = -1 * status; - for (i = 0; i < http_status_fail_num; i++) { - if (http_status_fail[i] == status) - return 1; - else if (http_status_fail[i] == soft_status) - return -1; - } - return 0; -} - -char **jk_parse_sysprops(jk_pool_t *p, const char *sysprops) -{ - char **rc = NULL; -#ifdef _MT_CODE_PTHREAD - char *lasts; -#endif - - if (p && sysprops) { - char *prps = jk_pool_strdup(p, sysprops); - if (prps && strlen(prps)) { - unsigned num_of_prps; - - for (num_of_prps = 1; *sysprops; sysprops++) { - if ('*' == *sysprops) { - num_of_prps++; - } - } - - rc = jk_pool_alloc(p, (num_of_prps + 1) * sizeof(char *)); - if (rc) { - unsigned i = 0; -#ifdef _MT_CODE_PTHREAD - char *tmp = strtok_r(prps, "*", &lasts); -#else - char *tmp = strtok(prps, "*"); -#endif - - while (tmp && i < num_of_prps) { - rc[i] = tmp; -#ifdef _MT_CODE_PTHREAD - tmp = strtok_r(NULL, "*", &lasts); -#else - tmp = strtok(NULL, "*"); -#endif - i++; - } - rc[i] = NULL; - } - } - } - - return rc; -} - -void jk_append_libpath(jk_pool_t *p, const char *libpath) -{ - char *env = NULL; - char *current = getenv(PATH_ENV_VARIABLE); - - if (current) { - env = jk_pool_alloc(p, strlen(PATH_ENV_VARIABLE) + - strlen(current) + strlen(libpath) + 5); - if (env) { - sprintf(env, "%s=%s%c%s", - PATH_ENV_VARIABLE, libpath, PATH_SEPERATOR, current); - } - } - else { - env = jk_pool_alloc(p, strlen(PATH_ENV_VARIABLE) + - strlen(libpath) + 5); - if (env) { - sprintf(env, "%s=%s", PATH_ENV_VARIABLE, libpath); - } - } - - if (env) { - putenv(env); - } -} - -void jk_init_ws_service(jk_ws_service_t *s) -{ - s->ws_private = NULL; - s->pool = NULL; - s->method = NULL; - s->protocol = NULL; - s->req_uri = NULL; - s->remote_addr = NULL; - s->remote_port = NULL; - s->remote_host = NULL; - s->remote_user = NULL; - s->auth_type = NULL; - s->query_string = NULL; - s->server_name = NULL; - s->server_port = 80; - s->server_software = NULL; - s->content_length = 0; - s->is_chunked = 0; - s->no_more_chunks = 0; - s->content_read = 0; - s->is_ssl = JK_FALSE; - s->ssl_cert = NULL; - s->ssl_cert_len = 0; - s->ssl_cipher = NULL; - s->ssl_session = NULL; - s->ssl_key_size = -1; - s->headers_names = NULL; - s->headers_values = NULL; - s->num_headers = 0; - s->attributes_names = NULL; - s->attributes_values = NULL; - s->num_attributes = 0; - s->route = NULL; - s->activation = JK_LB_ACTIVATION_ACTIVE; - s->secret = NULL; - s->reco_buf = NULL; - s->reco_status = RECO_NONE; - s->flush_packets = JK_FALSE; - s->flush_header = JK_FALSE; - s->extension.reply_timeout = -1; - s->extension.use_server_error_pages = 0; - s->extension.activation = NULL; - s->extension.fail_on_status_size = 0; - s->extension.fail_on_status = NULL; - s->response_started = JK_FALSE; - s->response_blocked = JK_FALSE; - s->http_response_status = JK_HTTP_OK; - s->uw_map = NULL; - s->start_response = NULL; - s->read = NULL; - s->write = NULL; - s->flush = NULL; - s->done = NULL; - s->disable_reuse = JK_FALSE; - s->add_log_items = NULL; - s->next_vhost = NULL; - s->vhost_to_text = NULL; - s->vhost_to_uw_map = NULL; -} - -/* Match = 0, NoMatch = 1, Abort = -1 - * Based loosely on sections of wildmat.c by Rich Salz - */ -int jk_wildchar_match(const char *str, const char *exp, int icase) -{ - int x, y; - - for (x = 0, y = 0; exp[y]; ++y, ++x) { - if (!str[x] && exp[y] != '*') - return -1; - if (exp[y] == '*') { - while (exp[++y] == '*'); - if (!exp[y]) - return 0; - while (str[x]) { - int ret; - if ((ret = jk_wildchar_match(&str[x++], &exp[y], icase)) != 1) - return ret; - } - return -1; - } - else if (exp[y] != '?') { - if (icase && (tolower(str[x]) != tolower(exp[y]))) - return 1; - else if (!icase && str[x] != exp[y]) - return 1; - } - } - return (str[x] != '\0'); -} - -#ifdef _MT_CODE_PTHREAD -jk_pthread_t jk_gettid() -{ - union { - pthread_t tid; - jk_uint64_t alignme; - } u; -#ifdef AS400 - /* OS400 use 64 bits ThreadId */ - pthread_id_np_t tid; -#endif /* AS400 */ - u.tid = pthread_self(); -#ifdef AS400 - /* Get only low 32 bits for now */ - pthread_getunique_np(&(u.tid), &tid); - return ((jk_uint32_t)(tid.intId.lo & 0xFFFFFFFF)); -#else - return ((jk_pthread_t)u.tid); -#endif /* AS400 */ -} -#endif - -/*** - * ASCII <-> EBCDIC conversions - * - * For now usefull only in i5/OS V5R4 where UTF and EBCDIC mode are mixed - */ - -#ifdef AS400_UTF8 - -/* EBCDIC to ASCII translation table */ -static u_char ebcdic_to_ascii[256] = -{ - 0x00,0x01,0x02,0x03,0x20,0x09,0x20,0x7f, /* 00-07 */ - 0x20,0x20,0x20,0x0b,0x0c,0x0d,0x0e,0x0f, /* 08-0f */ - 0x10,0x11,0x12,0x13,0x20,0x0a,0x08,0x20, /* 10-17 */ - 0x18,0x19,0x20,0x20,0x20,0x1d,0x1e,0x1f, /* 18-1f */ - 0x20,0x20,0x1c,0x20,0x20,0x0a,0x17,0x1b, /* 20-27 */ - 0x20,0x20,0x20,0x20,0x20,0x05,0x06,0x07, /* 28-2f */ - 0x20,0x20,0x16,0x20,0x20,0x20,0x20,0x04, /* 30-37 */ - 0x20,0x20,0x20,0x20,0x14,0x15,0x20,0x1a, /* 38-3f */ - 0x20,0x20,0x83,0x84,0x85,0xa0,0xc6,0x86, /* 40-47 */ - 0x87,0xa4,0xbd,0x2e,0x3c,0x28,0x2b,0x7c, /* 48-4f */ - 0x26,0x82,0x88,0x89,0x8a,0xa1,0x8c,0x8b, /* 50-57 */ - 0x8d,0xe1,0x21,0x24,0x2a,0x29,0x3b,0xaa, /* 58-5f */ - 0x2d,0x2f,0xb6,0x8e,0xb7,0xb5,0xc7,0x8f, /* 60-67 */ - 0x80,0xa5,0xdd,0x2c,0x25,0x5f,0x3e,0x3f, /* 68-6f */ - 0x9b,0x90,0xd2,0xd3,0xd4,0xd6,0xd7,0xd8, /* 70-77 */ - 0xde,0x60,0x3a,0x23,0x40,0x27,0x3d,0x22, /* 78-7f */ - 0x9d,0x61,0x62,0x63,0x64,0x65,0x66,0x67, /* 80-87 */ - 0x68,0x69,0xae,0xaf,0xd0,0xec,0xe7,0xf1, /* 88-8f */ - 0xf8,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,0x70, /* 90-97 */ - 0x71,0x72,0xa6,0xa7,0x91,0xf7,0x92,0xcf, /* 98-9f */ - 0xe6,0x7e,0x73,0x74,0x75,0x76,0x77,0x78, /* a8-a7 */ - 0x79,0x7a,0xad,0xa8,0xd1,0xed,0xe8,0xa9, /* a8-af */ - 0x5e,0x9c,0xbe,0xfa,0xb8,0x15,0x14,0xac, /* b0-b7 */ - 0xab,0xf3,0x5b,0x5d,0xee,0xf9,0xef,0x9e, /* b8-bf */ - 0x7b,0x41,0x42,0x43,0x44,0x45,0x46,0x47, /* c0-c7 */ - 0x48,0x49,0xf0,0x93,0x94,0x95,0xa2,0xe4, /* c8-cf */ - 0x7d,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50, /* d0-d7 */ - 0x51,0x52,0xfb,0x96,0x81,0x97,0xa3,0x98, /* d8-df */ - 0x5c,0xf6,0x53,0x54,0x55,0x56,0x57,0x58, /* e0-e7 */ - 0x59,0x5a,0xfc,0xe2,0x99,0xe3,0xe0,0xe5, /* e8-ef */ - 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, /* f0-f7 */ - 0x38,0x39,0xfd,0xea,0x9a,0xeb,0xe9,0xff /* f8-ff */ -}; - -/* ASCII to EBCDIC translation table */ -static u_char ascii_to_ebcdic[256] = -{ - 0x00,0x01,0x02,0x03,0x37,0x2d,0x2e,0x2f, /* 00-07 */ - 0x16,0x05,0x25,0x0b,0x0c,0x0d,0x0e,0x0f, /* 08-0f */ - 0x10,0x11,0x12,0x13,0x3c,0x3d,0x32,0x26, /* 10-17 */ - 0x18,0x19,0x3f,0x27,0x22,0x1d,0x1e,0x1f, /* 18-1f */ - 0x40,0x5a,0x7f,0x7b,0x5b,0x6c,0x50,0x7d, /* 20-27 */ - 0x4d,0x5d,0x5c,0x4e,0x6b,0x60,0x4b,0x61, /* 28-2f */ - 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7, /* 30-37 */ - 0xf8,0xf9,0x7a,0x5e,0x4c,0x7e,0x6e,0x6f, /* 38-3f */ - 0x7c,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7, /* 40-47 */ - 0xc8,0xc9,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6, /* 48-4f */ - 0xd7,0xd8,0xd9,0xe2,0xe3,0xe4,0xe5,0xe6, /* 50-57 */ - 0xe7,0xe8,0xe9,0xba,0xe0,0xbb,0xb0,0x6d, /* 58-5f */ - 0x79,0x81,0x82,0x83,0x84,0x85,0x86,0x87, /* 60-67 */ - 0x88,0x89,0x91,0x92,0x93,0x94,0x95,0x96, /* 68-6f */ - 0x97,0x98,0x99,0xa2,0xa3,0xa4,0xa5,0xa6, /* 70-77 */ - 0xa7,0xa8,0xa9,0xc0,0x4f,0xd0,0xa1,0x07, /* 78-7f */ - 0x68,0xdc,0x51,0x42,0x43,0x44,0x47,0x48, /* 80-87 */ - 0x52,0x53,0x54,0x57,0x56,0x58,0x63,0x67, /* 88-8f */ - 0x71,0x9c,0x9e,0xcb,0xcc,0xcd,0xdb,0xdd, /* 90-97 */ - 0xdf,0xec,0xfc,0x70,0xb1,0x80,0xbf,0x40, /* 98-9f */ - 0x45,0x55,0xee,0xde,0x49,0x69,0x9a,0x9b, /* a8-a7 */ - 0xab,0xaf,0x5f,0xb8,0xb7,0xaa,0x8a,0x8b, /* a8-af */ - 0x40,0x40,0x40,0x40,0x40,0x65,0x62,0x64, /* b0-b7 */ - 0xb4,0x40,0x40,0x40,0x40,0x4a,0xb2,0x40, /* b8-bf */ - 0x40,0x40,0x40,0x40,0x40,0x40,0x46,0x66, /* c0-c7 */ - 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x9f, /* c8-cf */ - 0x8c,0xac,0x72,0x73,0x74,0x89,0x75,0x76, /* d0-d7 */ - 0x77,0x40,0x40,0x40,0x40,0x6a,0x78,0x40, /* d8-df */ - 0xee,0x59,0xeb,0xed,0xcf,0xef,0xa0,0x8e, /* e0-e7 */ - 0xae,0xfe,0xfb,0xfd,0x8d,0xad,0xbc,0xbe, /* e8-ef */ - 0xca,0x8f,0x40,0xb9,0xb6,0xb5,0xe1,0x9d, /* f0-f7 */ - 0x90,0xbd,0xb3,0xda,0xea,0xfa,0x40,0x40 /* f8-ff */ -}; - -void jk_ascii2ebcdic(char *src, char *dst) { - char c; - - while ((c = *src++) != 0) { - *dst++ = ascii_to_ebcdic[(unsigned int)c]; - } - - *dst = 0; -} - -void jk_ebcdic2ascii(char *src, char *dst) { - char c; - - while ((c = *src++) != 0) { - *dst++ = ebcdic_to_ascii[(unsigned int)c]; - } - - *dst = 0; -} - -#endif diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.h deleted file mode 100644 index b76d0283..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.h +++ /dev/null @@ -1,269 +0,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. - */ - -/*************************************************************************** - * Description: Various utility functions * - * Author: Gal Shachor * - * Author: Henri Gomez * - * Author: Rainer Jung * - * Version: $Revision: 751914 $ * - ***************************************************************************/ -#ifndef _JK_UTIL_H -#define _JK_UTIL_H - -#include "jk_global.h" -#include "jk_logger.h" -#include "jk_map.h" -#include "jk_pool.h" -#include "jk_service.h" - -#define JK_SLEEP_DEF (100) - -const char *jk_get_bool(int v); - -int jk_get_bool_code(const char *v, int def); - -void jk_sleep(int ms); - -void jk_set_time_fmt(jk_logger_t *l, const char *jk_log_fmt); - -int jk_parse_log_level(const char *level); - -int jk_open_file_logger(jk_logger_t **l, const char *file, int level); - -int jk_attach_file_logger(jk_logger_t **l, int fd, int level); - -int jk_close_file_logger(jk_logger_t **l); - -int jk_log(jk_logger_t *l, - const char *file, int line, const char *funcname, int level, - const char *fmt, ...); - -/* [V] Two general purpose functions. Should ease the function bloat. */ -int jk_get_worker_str_prop(jk_map_t *m, - const char *wname, const char *pname, const char **prop); - -int jk_get_worker_int_prop(jk_map_t *m, - const char *wname, const char *pname, int *prop); - -const char *jk_get_worker_host(jk_map_t *m, const char *wname, const char *def); - -const char *jk_get_worker_type(jk_map_t *m, const char *wname); - -int jk_get_worker_port(jk_map_t *m, const char *wname, int def); - -int jk_get_worker_cache_size(jk_map_t *m, const char *wname, int def); - -int jk_get_worker_cache_size_min(jk_map_t *m, const char *wname, int def); - -int jk_get_worker_cache_acquire_timeout(jk_map_t *m, const char *wname, int def); - -int jk_get_worker_socket_timeout(jk_map_t *m, const char *wname, int def); - -int jk_get_worker_socket_connect_timeout(jk_map_t *m, const char *wname, int def); - -int jk_get_worker_socket_buffer(jk_map_t *m, const char *wname, int def); - -int jk_get_worker_socket_keepalive(jk_map_t *m, const char *wname, int def); - -int jk_get_worker_conn_ping_interval(jk_map_t *m, const char *wname, int def); - -int jk_get_worker_cache_timeout(jk_map_t *m, const char *wname, int def); - -int jk_get_worker_recovery_opts(jk_map_t *m, const char *wname, int def); - -int jk_get_worker_connect_timeout(jk_map_t *m, const char *wname, int def); - -int jk_get_worker_reply_timeout(jk_map_t *m, const char *wname, int def); - -int jk_get_worker_prepost_timeout(jk_map_t *m, const char *wname, int def); - -int jk_get_worker_ping_timeout(jk_map_t *m, const char *wname, int def); - -int jk_get_worker_ping_mode(jk_map_t *m, const char *wname, int def); - -int jk_get_worker_recycle_timeout(jk_map_t *m, const char *wname, int def); - -int jk_get_worker_recover_timeout(jk_map_t *m, const char *wname, int def); - -int jk_get_worker_error_escalation_time(jk_map_t *m, const char *wname, int def); - -int jk_get_worker_max_reply_timeouts(jk_map_t *m, const char *wname, int def); - -int jk_get_worker_retry_interval(jk_map_t *m, const char *wname, int def); - -const char *jk_get_worker_route(jk_map_t *m, const char *wname, const char *def); - -const char *jk_get_worker_domain(jk_map_t *m, const char *wname, const char *def); - -const char *jk_get_worker_redirect(jk_map_t *m, const char *wname, const char *def); - -const char *jk_get_worker_secret_key(jk_map_t *m, const char *wname); - -const char *jk_get_lb_session_cookie(jk_map_t *m, const char *wname, const char *def); - -const char *jk_get_lb_session_path(jk_map_t *m, const char *wname, const char *def); - -int jk_get_worker_retries(jk_map_t *m, const char *wname, int def); - -int jk_get_is_worker_disabled(jk_map_t *m, const char *wname); - -int jk_get_is_worker_stopped(jk_map_t *m, const char *wname); - -int jk_get_worker_activation(jk_map_t *m, const char *wname); - -int jk_get_worker_list(jk_map_t *m, char ***list, unsigned *num_of_workers); - -int jk_get_lb_factor(jk_map_t *m, const char *wname); - -int jk_get_distance(jk_map_t *m, const char *wname); - -int jk_get_is_sticky_session(jk_map_t *m, const char *wname); - -int jk_get_is_sticky_session_force(jk_map_t *m, const char *wname); - -int jk_get_lb_method(jk_map_t *m, const char *wname); - -int jk_get_lb_lock(jk_map_t *m, const char *wname); - -int jk_get_lb_worker_list(jk_map_t *m, - const char *lb_wname, - char ***list, unsigned int *num_of_workers); -int jk_get_worker_mount_list(jk_map_t *m, - const char *wname, - char ***list, unsigned int *num_of_maps); -const char *jk_get_worker_secret(jk_map_t *m, const char *wname); - -int jk_get_worker_mx(jk_map_t *m, const char *wname, unsigned *mx); - -int jk_get_worker_ms(jk_map_t *m, const char *wname, unsigned *ms); - -int jk_get_worker_classpath(jk_map_t *m, const char *wname, const char **cp); - - -int jk_get_worker_bridge_type(jk_map_t *m, const char *wname, unsigned *bt); - -int jk_get_worker_jvm_path(jk_map_t *m, const char *wname, const char **vm_path); - -int jk_get_worker_callback_dll(jk_map_t *m, - const char *wname, const char **cb_path); - -int jk_get_worker_cmd_line(jk_map_t *m, const char *wname, const char **cmd_line); - -int jk_file_exists(const char *f); - -int jk_is_list_property(const char *prp_name); - -int jk_is_path_property(const char *prp_name); - -int jk_is_cmd_line_property(const char *prp_name); - -int jk_is_unique_property(const char *prp_name); - -int jk_is_deprecated_property(const char *prp_name); - -int jk_is_valid_property(const char *prp_name); - -int jk_get_worker_stdout(jk_map_t *m, const char *wname, const char **stdout_name); - -int jk_get_worker_stderr(jk_map_t *m, const char *wname, const char **stderr_name); - -int jk_get_worker_sysprops(jk_map_t *m, const char *wname, const char **sysprops); - -int jk_get_worker_libpath(jk_map_t *m, const char *wname, const char **libpath); - -char **jk_parse_sysprops(jk_pool_t *p, const char *sysprops); - - -void jk_append_libpath(jk_pool_t *p, const char *libpath); - -void jk_set_worker_def_cache_size(int sz); - -int jk_get_worker_def_cache_size(int protocol); - -int jk_get_worker_maintain_time(jk_map_t *m); - -int jk_get_max_packet_size(jk_map_t *m, const char *wname); - -const char *jk_get_worker_style_sheet(jk_map_t *m, const char *wname, const char *def); - -int jk_get_is_read_only(jk_map_t *m, const char *wname); - -int jk_get_worker_user_list(jk_map_t *m, - const char *wname, - char ***list, unsigned int *num); - -int jk_get_worker_good_rating(jk_map_t *m, - const char *wname, - char ***list, unsigned int *num); - -int jk_get_worker_bad_rating(jk_map_t *m, - const char *wname, - char ***list, unsigned int *num); - -const char *jk_get_worker_name_space(jk_map_t *m, const char *wname, const char *def); - -const char *jk_get_worker_xmlns(jk_map_t *m, const char *wname, const char *def); - -const char *jk_get_worker_xml_doctype(jk_map_t *m, const char *wname, const char *def); - -const char *jk_get_worker_prop_prefix(jk_map_t *m, const char *wname, const char *def); - -int jk_get_worker_fail_on_status(jk_map_t *m, const char *wname, - int *list, unsigned int list_size); - -int jk_get_worker_user_case_insensitive(jk_map_t *m, const char *wname); - -int is_http_status_fail(unsigned int http_status_fail_num, - int *http_status_fail, int status); - -int jk_wildchar_match(const char *str, const char *exp, int icase); - -#define TC32_BRIDGE_TYPE 32 -#define TC33_BRIDGE_TYPE 33 -#define TC40_BRIDGE_TYPE 40 -#define TC41_BRIDGE_TYPE 41 -#define TC50_BRIDGE_TYPE 50 - -#ifdef AS400 - -#define S_IFREG _S_IFREG - -#ifdef AS400_UTF8 - -void jk_ascii2ebcdic(char *src, char *dst); -void jk_ebcdic2ascii(char *src, char *dst); - -#endif /* AS400_UTF8 */ - -#endif - -/* i5/OS V5R4 need ASCII-EBCDIC conversion before stat() call */ -/* added a stat() mapper function, jk_stat, for such purpose */ - -int jk_stat(const char *f, struct stat * statbuf); - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* _JK_UTIL_H */ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.lo deleted file mode 100644 index a7acb278..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.lo +++ /dev/null @@ -1,12 +0,0 @@ -# jk_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/jk_util.o' - -# Name of the non-PIC object. -non_pic_object='jk_util.o' - diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.o deleted file mode 100644 index 5d343b71..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_version.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_version.h deleted file mode 100644 index 9cbba921..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_version.h +++ /dev/null @@ -1,96 +0,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. - */ - -/*************************************************************************** - * Description: JK version header file * - * Version: $Revision: 1141394 $ * - ***************************************************************************/ - -#ifndef __JK_VERSION_H -#define __JK_VERSION_H - -/************** START OF AREA TO MODIFY BEFORE RELEASING *************/ -#define JK_VERMAJOR 1 -#define JK_VERMINOR 2 -#define JK_VERFIX 32 - -/* set JK_VERISRELEASE to 1 when release (do not forget to commit!) */ -#define JK_VERISRELEASE 1 -/* Beta number */ -#define JK_VERBETA 0 -#define JK_BETASTRING "0" -/* Release candidate */ -#define JK_VERRC 0 -#define JK_RCSTRING "0" -/* Source Control Revision as a suffix, e.g. "-r12345" */ -#define JK_REVISION " ()" - -/************** END OF AREA TO MODIFY BEFORE RELEASING *************/ - -#if !defined(PACKAGE) -#if defined(JK_ISAPI) -#define PACKAGE "isapi_redirector" -#define JK_DLL_SUFFIX "dll" -#elif defined(JK_NSAPI) -#define PACKAGE "nsapi_redirector" -#define JK_DLL_SUFFIX "dll" -#else -#define PACKAGE "mod_jk" -#define JK_DLL_SUFFIX "so" -#endif -#endif - -/* Build JK_EXPOSED_VERSION and JK_VERSION */ -#define JK_EXPOSED_VERSION_INT PACKAGE "/" JK_VERSTRING - -#if (JK_VERBETA != 0) -#define JK_EXPOSED_VERSION JK_EXPOSED_VERSION_INT "-beta-" JK_BETASTRING -#else -#undef JK_VERBETA -#define JK_VERBETA 255 -#if (JK_VERRC != 0) -#define JK_EXPOSED_VERSION JK_EXPOSED_VERSION_INT "-rc-" JK_RCSTRING -#elif (JK_VERISRELEASE == 1) -#define JK_EXPOSED_VERSION JK_EXPOSED_VERSION_INT -#else -#define JK_EXPOSED_VERSION JK_EXPOSED_VERSION_INT "-dev" JK_REVISION -#endif -#endif -#define JK_FULL_EXPOSED_VERSION JK_EXPOSED_VERSION JK_REVISION - -#define JK_MAKEVERSION(major, minor, fix, beta) \ - (((major) << 24) + ((minor) << 16) + ((fix) << 8) + (beta)) - -#define JK_VERSION JK_MAKEVERSION(JK_VERMAJOR, JK_VERMINOR, JK_VERFIX, JK_VERBETA) - -/** Properly quote a value as a string in the C preprocessor */ -#define JK_STRINGIFY(n) JK_STRINGIFY_HELPER(n) -/** Helper macro for JK_STRINGIFY */ -#define JK_STRINGIFY_HELPER(n) #n -#define JK_VERSTRING \ - JK_STRINGIFY(JK_VERMAJOR) "." \ - JK_STRINGIFY(JK_VERMINOR) "." \ - JK_STRINGIFY(JK_VERFIX) - -/* macro for Win32 .rc files using numeric csv representation */ -#define JK_VERSIONCSV JK_VERMAJOR ##, \ - ##JK_VERMINOR ##, \ - ##JK_VERFIX - - -#endif /* __JK_VERSION_H */ - diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.c deleted file mode 100644 index b75ae933..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.c +++ /dev/null @@ -1,351 +0,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. - */ - -/*************************************************************************** - * Description: Workers controller * - * Author: Gal Shachor * - * Author: Henri Gomez * - * Version: $Revision: 708019 $ * - ***************************************************************************/ - -#define _PLACE_WORKER_LIST_HERE -#include "jk_worker_list.h" -#include "jk_worker.h" -#include "jk_util.h" -#include "jk_mt.h" - -static void close_workers(jk_logger_t *l); - -static worker_factory get_factory_for(const char *type); - -static int build_worker_map(jk_map_t *init_data, - char **worker_list, - unsigned num_of_workers, - jk_worker_env_t *we, jk_logger_t *l); - -/* Global worker list */ -static jk_map_t *worker_map; -#if _MT_CODE -static JK_CRIT_SEC worker_lock; -#endif -static int worker_maintain_time = 0; - -int wc_open(jk_map_t *init_data, jk_worker_env_t *we, jk_logger_t *l) -{ - int rc; - JK_TRACE_ENTER(l); - - if (!jk_map_alloc(&worker_map)) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } - JK_INIT_CS(&worker_lock, rc); - if (rc == JK_FALSE) { - jk_log(l, JK_LOG_ERROR, - "creating thread lock (errno=%d)", - errno); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - jk_map_dump(init_data, l); - we->init_data = init_data; - if (!jk_get_worker_list(init_data, &(we->worker_list), - &we->num_of_workers)) { - JK_TRACE_EXIT(l); - we->num_of_workers = 0; - we->worker_list = NULL; - return JK_FALSE; - } - - worker_maintain_time = jk_get_worker_maintain_time(init_data); - if(worker_maintain_time < 0) - worker_maintain_time = 0; - - if (!build_worker_map(init_data, we->worker_list, - we->num_of_workers, we, l)) { - close_workers(l); - we->num_of_workers = 0; - we->worker_list = NULL; - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - - -void wc_close(jk_logger_t *l) -{ - int rc; - JK_TRACE_ENTER(l); - JK_DELETE_CS(&worker_lock, rc); - close_workers(l); - JK_TRACE_EXIT(l); -} - -jk_worker_t *wc_get_worker_for_name(const char *name, jk_logger_t *l) -{ - jk_worker_t *rc; - - JK_TRACE_ENTER(l); - if (!name) { - JK_LOG_NULL_PARAMS(l); - JK_TRACE_EXIT(l); - return NULL; - } - - rc = jk_map_get(worker_map, name, NULL); - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, "%s a worker %s", - rc ? "found" : "did not find", name); - JK_TRACE_EXIT(l); - return rc; -} - -int wc_create_worker(const char *name, int use_map, - jk_map_t *init_data, - jk_worker_t **rc, jk_worker_env_t *we, jk_logger_t *l) -{ - JK_TRACE_ENTER(l); - - if (rc) { - const char *type = jk_get_worker_type(init_data, name); - worker_factory fac = get_factory_for(type); - jk_worker_t *w = NULL; - unsigned int i, num_of_maps; - char **map_names; - int wtype; - - *rc = NULL; - - if (!fac) { - jk_log(l, JK_LOG_ERROR, "Unknown worker type %s for worker %s", - type, name); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "about to create instance %s of %s", name, - type); - - if (((wtype = fac(&w, name, l)) == 0) || !w) { - jk_log(l, JK_LOG_ERROR, - "factory for %s failed for %s", type, - name); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "about to validate and init %s", name); - if (!w->validate(w, init_data, we, l)) { - w->destroy(&w, l); - jk_log(l, JK_LOG_ERROR, - "validate failed for %s", name); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (!w->init(w, init_data, we, l)) { - w->destroy(&w, l); - jk_log(l, JK_LOG_ERROR, "init failed for %s", - name); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - if (use_map && - jk_get_worker_mount_list(init_data, name, - &map_names, - &num_of_maps) && num_of_maps) { - for (i = 0; i < num_of_maps; i++) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "mounting %s to worker %s", - map_names[i], name); - if (uri_worker_map_add(we->uri_to_worker, map_names[i], - name, SOURCE_TYPE_WORKERDEF, l) == JK_FALSE) { - w->destroy(&w, l); - jk_log(l, JK_LOG_ERROR, - "mounting %s failed for %s", - map_names[i], name); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - } - w->type = wtype; - *rc = w; - JK_TRACE_EXIT(l); - return JK_TRUE; - } - - JK_LOG_NULL_PARAMS(l); - return JK_FALSE; -} - -static void close_workers(jk_logger_t *l) -{ - int sz = jk_map_size(worker_map); - - JK_TRACE_ENTER(l); - - if (sz > 0) { - int i; - for (i = 0; i < sz; i++) { - jk_worker_t *w = jk_map_value_at(worker_map, i); - if (w) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "close_workers will destroy worker %s", - jk_map_name_at(worker_map, i)); - w->destroy(&w, l); - } - } - } - jk_map_free(&worker_map); - JK_TRACE_EXIT(l); -} - -static int build_worker_map(jk_map_t *init_data, - char **worker_list, - unsigned num_of_workers, - jk_worker_env_t *we, jk_logger_t *l) -{ - unsigned i; - - JK_TRACE_ENTER(l); - - for (i = 0; i < num_of_workers; i++) { - jk_worker_t *w = NULL; - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "creating worker %s", worker_list[i]); - - if (wc_create_worker(worker_list[i], 1, init_data, &w, we, l)) { - jk_worker_t *oldw = NULL; - if (!jk_map_put(worker_map, worker_list[i], w, (void *)&oldw)) { - w->destroy(&w, l); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - - if (oldw) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "removing old %s worker", - worker_list[i]); - oldw->destroy(&oldw, l); - } - } - else { - jk_log(l, JK_LOG_ERROR, - "failed to create worker %s", - worker_list[i]); - JK_TRACE_EXIT(l); - return JK_FALSE; - } - } - - JK_TRACE_EXIT(l); - return JK_TRUE; -} - -static worker_factory get_factory_for(const char *type) -{ - worker_factory_record_t *factory = &worker_factories[0]; - while (factory->name) { - if (0 == strcmp(factory->name, type)) { - return factory->fac; - } - - factory++; - } - - return NULL; -} - -const char *wc_get_name_for_type(int type, jk_logger_t *l) -{ - worker_factory_record_t *factory = &worker_factories[0]; - while (factory->name) { - if (type == factory->type) { - jk_log(l, JK_LOG_DEBUG, - "Found worker type '%s'", - factory->name); - return factory->name; - } - - factory++; - } - - return NULL; -} - -void wc_maintain(jk_logger_t *l) -{ - static time_t last_maintain = 0; - static int running_maintain = 0; - int sz = jk_map_size(worker_map); - - JK_TRACE_ENTER(l); - - /* Only proceed if all of the below hold true: - * - there are workers - * - maintenance wasn't disabled by configuration - * - time since last maintenance is big enough - */ - if (sz > 0 && worker_maintain_time > 0 && - difftime(time(NULL), last_maintain) >= worker_maintain_time) { - int i; - JK_ENTER_CS(&worker_lock, i); - if (running_maintain || - difftime(time(NULL), last_maintain) < worker_maintain_time) { - /* Already in maintain */ - JK_LEAVE_CS(&worker_lock, i); - JK_TRACE_EXIT(l); - return; - } - /* Set the maintain run flag so other threads skip - * the maintain until we are finished. - */ - running_maintain = 1; - JK_LEAVE_CS(&worker_lock, i); - - for (i = 0; i < sz; i++) { - jk_worker_t *w = jk_map_value_at(worker_map, i); - if (w && w->maintain) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Maintaining worker %s", - jk_map_name_at(worker_map, i)); - w->maintain(w, time(NULL), l); - } - } - JK_ENTER_CS(&worker_lock, i); - last_maintain = time(NULL); - running_maintain = 0; - JK_LEAVE_CS(&worker_lock, i); - } - JK_TRACE_EXIT(l); -} diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.h deleted file mode 100644 index 18e9097c..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.h +++ /dev/null @@ -1,55 +0,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. - */ - -/*************************************************************************** - * Description: Workers controller header file * - * Author: Gal Shachor * - * Version: $Revision: 466585 $ * - ***************************************************************************/ - -#ifndef JK_WORKER_H -#define JK_WORKER_H - -#include "jk_logger.h" -#include "jk_service.h" -#include "jk_map.h" -#include "jk_uri_worker_map.h" - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -int wc_open(jk_map_t *init_data, jk_worker_env_t *we, jk_logger_t *l); - -void wc_close(jk_logger_t *l); - -jk_worker_t *wc_get_worker_for_name(const char *name, jk_logger_t *l); - -const char *wc_get_name_for_type(int type, jk_logger_t *l); - -int wc_create_worker(const char *name, int use_map, - jk_map_t *init_data, - jk_worker_t **rc, - jk_worker_env_t *we, jk_logger_t *l); - -void wc_maintain(jk_logger_t *l); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* JK_WORKER_H */ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.lo deleted file mode 100644 index 45a6af4b..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.lo +++ /dev/null @@ -1,12 +0,0 @@ -# jk_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/jk_worker.o' - -# Name of the non-PIC object. -non_pic_object='jk_worker.o' - diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.o deleted file mode 100644 index 756f2510..00000000 Binary files a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.o and /dev/null differ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker_list.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker_list.h deleted file mode 100644 index 59518b2a..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker_list.h +++ /dev/null @@ -1,98 +0,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. - */ - -/*************************************************************************** - * Description: Worker list * - * Author: Gal Shachor * - * Author: Henri Gomez * - * Version: $Revision: 466585 $ * - ***************************************************************************/ - -/* - * This file includes a list of all the possible workers in the jk library - * plus their factories. - * - * If you want to add a worker just place it in the worker_factories array - * with its unique name and factory. - * - * If you want to remove a worker, hjust comment out its line in the - * worker_factories array as well as its header file. For example, look - * at what we have done to the ajp23 worker. - * - * Note: This file should be included only in the jk_worker controller. - * Currently the jk_worker controller is located in jk_worker.c - */ -#ifdef _PLACE_WORKER_LIST_HERE -#ifndef _JK_WORKER_LIST_H -#define _JK_WORKER_LIST_H - -#include "jk_ajp12_worker.h" -#include "jk_ajp13_worker.h" -#include "jk_ajp14_worker.h" -#ifdef HAVE_JNI -#include "jk_jni_worker.h" -#endif -#include "jk_lb_worker.h" -#include "jk_status.h" - -struct worker_factory_record -{ - const char *name; - int type; - worker_factory fac; -}; -typedef struct worker_factory_record worker_factory_record_t; - -static worker_factory_record_t worker_factories[] = { - /* - * AJPv12 worker, this is the stable worker. - */ - {JK_AJP12_WORKER_NAME, JK_AJP12_WORKER_TYPE, ajp12_worker_factory}, - /* - * AJPv13 worker, fast bi-directional worker. - */ - {JK_AJP13_WORKER_NAME, JK_AJP13_WORKER_TYPE, ajp13_worker_factory}, - /* - * AJPv14 worker, next generation fast bi-directional worker. - */ - {JK_AJP14_WORKER_NAME, JK_AJP14_WORKER_TYPE, ajp14_worker_factory}, - /* - * In process JNI based worker. Requires the server to be - * multithreaded and to use native threads. - */ -#ifdef HAVE_JNI - {JK_JNI_WORKER_NAME, JK_JNI_WORKER_TYPE, jni_worker_factory}, -#endif - /* - * Load balancing worker. Performs round robin with sticky - * session load balancing. - */ - {JK_LB_WORKER_NAME, JK_LB_WORKER_TYPE, lb_worker_factory}, - - /* - * Status worker. Performs display display and - * worker management. - */ - {JK_STATUS_WORKER_NAME, JK_STATUS_WORKER_TYPE, status_worker_factory}, - - /* - * Marks the end of the worker factory list. - */ - {NULL, 0, NULL} -}; -#endif /* _JK_WORKER_LIST_H */ -#endif /* _PLACE_WORKER_LIST_HERE */ diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/list.mk b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/list.mk deleted file mode 100644 index 51fa1e0e..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/list.mk +++ /dev/null @@ -1,27 +0,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. - -## Object needed for mod_jk for Apache-1.3 -APACHE_OBJECTS= ${JK}jk_ajp12_worker${OEXT} ${JK}jk_connect${OEXT} \ - ${JK}jk_msg_buff${OEXT} ${JK}jk_util${OEXT} \ - ${JK}jk_ajp13${OEXT} ${JK}jk_pool${OEXT} \ - ${JK}jk_worker${OEXT} ${JK}jk_ajp13_worker${OEXT} \ - ${JK}jk_lb_worker${OEXT} ${JK}jk_sockbuf${OEXT} \ - ${JK}jk_map${OEXT} ${JK}jk_uri_worker_map${OEXT} \ - ${JK}jk_ajp14${OEXT} ${JK}jk_ajp14_worker${OEXT} \ - ${JK}jk_md5${OEXT} ${JK}jk_shm${OEXT} ${JK}jk_jni_worker${OEXT} \ - ${JK}jk_ajp_common${OEXT} ${JK}jk_context${OEXT} \ - ${JK}jk_url${OEXT} \ - ${JK}jk_status${OEXT} diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/list.mk.in b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/list.mk.in deleted file mode 100644 index abc7ffe5..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/list.mk.in +++ /dev/null @@ -1,27 +0,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. - -## Object needed for mod_jk for Apache-1.3 -APACHE_OBJECTS= ${JK}jk_ajp12_worker${OEXT} ${JK}jk_connect${OEXT} \ - ${JK}jk_msg_buff${OEXT} ${JK}jk_util${OEXT} \ - ${JK}jk_ajp13${OEXT} ${JK}jk_pool${OEXT} \ - ${JK}jk_worker${OEXT} ${JK}jk_ajp13_worker${OEXT} \ - ${JK}jk_lb_worker${OEXT} ${JK}jk_sockbuf${OEXT} \ - ${JK}jk_map${OEXT} ${JK}jk_uri_worker_map${OEXT} \ - ${JK}jk_ajp14${OEXT} ${JK}jk_ajp14_worker${OEXT} \ - ${JK}jk_md5${OEXT} ${JK}jk_shm${OEXT} @JK_JNI_WORKER@ \ - ${JK}jk_ajp_common${OEXT} ${JK}jk_context${OEXT} \ - ${JK}jk_url${OEXT} \ - ${JK}jk_status${OEXT} diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/stamp-h1 b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/stamp-h1 deleted file mode 100644 index 8189b45b..00000000 --- a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/stamp-h1 +++ /dev/null @@ -1 +0,0 @@ -timestamp for common/config.h -- cgit 1.2.3-korg