/* This file is part of Metaproxy.
- Copyright (C) 2005-2012 Index Data
+ Copyright (C) Index Data
Metaproxy is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
#include <yaz/log.h>
#include <yaz/otherinfo.h>
#include <yaz/diagbib1.h>
+#include <yaz/oid_db.h>
#include <yazpp/socket-manager.h>
#include <yazpp/pdu-assoc.h>
void timeoutNotify();
void recv_GDU(Z_GDU *gdu, int len);
void fixup_nsd(ODR odr, Z_Records *records);
+ void fixup_nsd(ODR odr, Z_DefaultDiagFormat *nsd);
void fixup_init(ODR odr, Z_InitResponse *initrs);
yazpp_1::IPDU_Observer* sessionNotify(
yazpp_1::IPDU_Observable *the_PDU_Observable,
int m_timeout_sec;
int m_max_sockets;
bool m_force_close;
+ bool m_client_ip;
std::string m_default_target;
std::string m_force_target;
boost::mutex m_mutex;
}
}
+void yf::Z3950Client::Assoc::fixup_nsd(ODR odr, Z_DefaultDiagFormat *nsd)
+{
+ std::string addinfo;
+
+ // should really check for nsd->which.. But union has two members
+ // containing almost same data
+ const char *v2Addinfo = nsd->u.v2Addinfo;
+ // Z_InternationalString *v3Addinfo;
+ if (v2Addinfo && *v2Addinfo)
+ {
+ addinfo.assign(nsd->u.v2Addinfo);
+ addinfo += " ";
+ }
+ addinfo += "(backend=" + m_host + ")";
+ nsd->u.v2Addinfo = odr_strdup(odr, addinfo.c_str());
+}
+
void yf::Z3950Client::Assoc::fixup_nsd(ODR odr, Z_Records *records)
{
if (records && records->which == Z_Records_NSD)
{
- Z_DefaultDiagFormat *nsd = records->u.nonSurrogateDiagnostic;
- std::string addinfo;
-
- // should really check for nsd->which.. But union has two members
- // containing almost same data
- const char *v2Addinfo = nsd->u.v2Addinfo;
- // Z_InternationalString *v3Addinfo;
-
- if (v2Addinfo && *v2Addinfo)
+ fixup_nsd(odr, records->u.nonSurrogateDiagnostic);
+ }
+ if (records && records->which == Z_Records_multipleNSD)
+ {
+ Z_DiagRecs *drecs = records->u.multipleNonSurDiagnostics;
+ int i;
+ for (i = 0; i < drecs->num_diagRecs; i++)
{
- addinfo.assign(nsd->u.v2Addinfo);
- addinfo += " ";
+ Z_DiagRec *dr = drecs->diagRecs[i];
+
+ if (dr->which == Z_DiagRec_defaultFormat)
+ fixup_nsd(odr, dr->u.defaultFormat);
}
- addinfo += "(backend=" + m_host + ")";
- nsd->u.v2Addinfo = odr_strdup(odr, addinfo.c_str());
}
}
odr,
(oaddinfo ? strlen(oaddinfo) : 0) + 20 +
m_host.length());
+ *naddinfo = '\0';
if (oaddinfo && *oaddinfo)
{
- strcpy(naddinfo, oaddinfo);
+ strcat(naddinfo, oaddinfo);
strcat(naddinfo, " ");
}
strcat(naddinfo, "(backend=");
m_p->m_timeout_sec = 30;
m_p->m_max_sockets = 0;
m_p->m_force_close = false;
+ m_p->m_client_ip = false;
}
yf::Z3950Client::~Z3950Client() {
mp::odr odr;
package.response() = odr.create_initResponse(
- apdu, YAZ_BIB1_TEMPORARY_SYSTEM_ERROR, "max sessions");
+ apdu, YAZ_BIB1_TEMPORARY_SYSTEM_ERROR,
+ "z3950_client: max sessions");
package.session().close();
return 0;
}
boost::xtime xt;
- xtime_get(&xt, boost::TIME_UTC);
+ xtime_get(&xt,
+#if BOOST_VERSION >= 105000
+ boost::TIME_UTC_
+#else
+ boost::TIME_UTC
+#endif
+ );
xt.sec += 15;
if (!m_cond_session_ready.timed_wait(lock, xt))
mp::odr odr;
package.response() = odr.create_initResponse(
- apdu, YAZ_BIB1_TEMPORARY_SYSTEM_ERROR, "max sessions");
+ apdu, YAZ_BIB1_TEMPORARY_SYSTEM_ERROR,
+ "z3950_client: max sessions");
package.session().close();
return 0;
}
if (gdu->u.z3950->which == Z_APDU_close)
c->m_has_closed = true;
+ Z_APDU *apdu = gdu->u.z3950;
+
// prepare connect
c->m_time_elapsed = 0;
c->m_waiting = true;
{
return;
}
-
+ mp::odr odr;
+ if (m_client_ip)
+ {
+ std::string peer_name2 = package.origin().get_address();
+ if (apdu->which == Z_APDU_initRequest && peer_name2.length())
+ {
+ Z_OtherInformation **oi = &apdu->u.initRequest->otherInfo;
+ char *peer_name1 =
+ yaz_oi_get_string_oid(oi, yaz_oid_userinfo_client_ip, 1, 1);
+ std::string pcomb;
+ if (peer_name1)
+ {
+ pcomb.append(peer_name1);
+ pcomb.append(", ");
+ }
+ pcomb.append(peer_name2);
+ yaz_oi_set_string_oid(&apdu->u.initRequest->otherInfo,
+ odr, yaz_oid_userinfo_client_ip,
+ 1, pcomb.c_str());
+ }
+ }
// prepare response
c->m_time_elapsed = 0;
c->m_waiting = true;
{
m_p->m_force_close = mp::xml::get_bool(ptr, 0);
}
+ else if (!strcmp((const char *) ptr->name, "client_ip"))
+ {
+ m_p->m_client_ip = mp::xml::get_bool(ptr, 0);
+ }
else
{
throw mp::filter::FilterException("Bad element "