X-Git-Url: http://sru.miketaylor.org.uk/?a=blobdiff_plain;f=src%2Fyaz-proxy.cpp;h=27455b8e59c1f5a16c890f3430a9486f30324778;hb=41e1069c089436d4ccae81dae22b574517add3d4;hp=e2195ba3129707cd938079a31819b19db993d273;hpb=84434e0d19b1ecd73ff09853f7cb3d96f343c237;p=yazproxy-moved-to-github.git diff --git a/src/yaz-proxy.cpp b/src/yaz-proxy.cpp index e2195ba..27455b8 100644 --- a/src/yaz-proxy.cpp +++ b/src/yaz-proxy.cpp @@ -1,4 +1,4 @@ -/* $Id: yaz-proxy.cpp,v 1.49 2006-04-06 01:16:55 adam Exp $ +/* $Id: yaz-proxy.cpp,v 1.54 2006-04-12 11:55:42 adam Exp $ Copyright (c) 1998-2006, Index Data. This file is part of the yazproxy. @@ -232,8 +232,10 @@ Yaz_Proxy::Yaz_Proxy(IPDU_Observable *the_PDU_Observable, m_bw_max = 0; m_pdu_max = 0; m_search_max = 0; - m_connect_max = 0; + m_max_connect = 0; + m_max_connect_period = 0; m_limit_connect = 0; + m_limit_connect_period = 0; m_timeout_mode = timeout_normal; m_timeout_gdu = 0; m_max_record_retrieve = 0; @@ -354,8 +356,12 @@ int Yaz_Proxy::set_config(const char *config) m_config_fname = xstrdup(config); int r = m_config->read_xml(config); if (!r) + { + int period = 60; m_config->get_generic_info(&m_log_mask, &m_max_clients, - &m_connect_max, &m_limit_connect); + &m_max_connect, &m_limit_connect, &period); + m_connect.set_period(period); + } return r; } @@ -406,8 +412,11 @@ Yaz_ProxyConfig *Yaz_Proxy::check_reconfigure() else { m_log_mask = 0; + int period = 60; cfg->get_generic_info(&m_log_mask, &m_max_clients, - &m_connect_max, &m_limit_connect); + &m_max_connect, &m_limit_connect, + &period); + m_connect.set_period(period); } } else @@ -423,17 +432,22 @@ IPDU_Observer *Yaz_Proxy::sessionNotify(IPDU_Observable check_reconfigure(); char session_str[200]; - sprintf(session_str, "%ld:%d ", (long) time(0), m_session_no); + const char *peername = the_PDU_Observable->getpeername(); + if (m_log_mask & PROXY_LOG_IP_CLIENT) + sprintf(session_str, "%ld:%d %s 0 ", + (long) time(0), m_session_no, peername); + else + sprintf(session_str, "%ld:%d 0 ", + (long) time(0), m_session_no); m_session_no++; - const char *peername = the_PDU_Observable->getpeername(); yaz_log (YLOG_LOG, "%sNew session %s", session_str, peername); m_connect.cleanup(false); m_connect.add_connect(peername); int connect_total = m_connect.get_total(peername); - int connect_max = m_connect_max; + int connect_max = m_max_connect; if (connect_max && connect_total > connect_max) { yaz_log(YLOG_LOG, "%sconnect not accepted total=%d max=%d", @@ -456,8 +470,12 @@ IPDU_Observer *Yaz_Proxy::sessionNotify(IPDU_Observable new_proxy->set_default_target(m_default_target); new_proxy->m_max_clients = m_max_clients; new_proxy->m_log_mask = m_log_mask; + + if (!strcmp(peername, "tcp:163.121.19.82")) // NIS GROUP + new_proxy->m_log_mask = 255; + new_proxy->set_APDU_log(get_APDU_log()); - if (m_log_mask & PROXY_LOG_APDU_CLIENT) + if (new_proxy->m_log_mask & PROXY_LOG_APDU_CLIENT) new_proxy->set_APDU_yazlog(1); else new_proxy->set_APDU_yazlog(0); @@ -734,8 +752,7 @@ Yaz_ProxyClient *Yaz_Proxy::get_client(Z_APDU *apdu, const char *cookie, yaz_log (YLOG_LOG, "%sMAXCLIENTS %d Destroy %d", m_session_str, parent->m_max_clients, c->m_seqno); if (c->m_server && c->m_server != this) - delete c->m_server; // PROBLEM: m_ref_count! - c->m_server = 0; + c->m_server->dec_ref(true); } else { @@ -750,7 +767,7 @@ Yaz_ProxyClient *Yaz_Proxy::get_client(Z_APDU *apdu, const char *cookie, if (c->m_server && c->m_server != this) { c->m_server->m_client = 0; - delete c->m_server; // PROBLEM: m_ref_count! + c->m_server->dec_ref(true); } (parent->m_seqno)++; c->m_target_idletime = m_target_idletime; @@ -1829,9 +1846,12 @@ Z_APDU *Yaz_Proxy::result_set_optimize(Z_APDU *apdu) void Yaz_Proxy::inc_request_no() { - char *cp = strchr(m_session_str, ' '); - m_request_no++; - if (cp) + char *cp = m_session_str + strlen(m_session_str)-1; + if (*cp == ' ') + cp--; + while (*cp && *cp != ' ') + cp--; + if (*cp) sprintf(cp+1, "%d ", m_request_no); } @@ -3058,7 +3078,7 @@ void Yaz_Proxy::handle_incoming_Z_PDU(Z_APDU *apdu) else { // Z39.50 just shutdown - delete this; + timeout(0); return; } } @@ -3459,9 +3479,12 @@ void Yaz_ProxyClient::timeoutNotify() if (m_server) m_server->send_response_fail_client(get_hostname()); + + Yaz_Proxy *proxy_root = m_root; + shutdown(); - m_root->pre_init(); + proxy_root->pre_init(); } Yaz_ProxyClient::Yaz_ProxyClient(IPDU_Observable *the_PDU_Observable, @@ -3560,8 +3583,19 @@ void Yaz_ProxyClient::recv_Z_PDU(Z_APDU *apdu, int len) *apdu->u.initResponse->maximumRecordSize; Z_InitResponse *ir = apdu->u.initResponse; + + // apply YAZ Proxy version + char *imv0 = ir->implementationVersion; + char *imv1 = (char*) + odr_malloc(m_init_odr, 20 + (imv0 ? strlen(imv0) : 0)); + *imv1 = '\0'; + if (imv0) + strcat(imv1, imv0); + strcat(imv1, "/" VERSION); + ir->implementationVersion = imv1; + + // apply YAZ Proxy implementation name char *im0 = ir->implementationName; - char *im1 = (char*) odr_malloc(m_init_odr, 20 + (im0 ? strlen(im0) : 0)); *im1 = '\0';