/*
- * $Id: zoom-c.c,v 1.33 2002-06-02 21:27:17 adam Exp $
+ * $Id: zoom-c.c,v 1.37 2002-07-25 12:51:48 adam Exp $
*
* ZOOM layer for C, connections, result sets, queries.
*/
if (!cp || !*cp)
{
- cp = strchr (con->host_port, '/');
+ if (strncmp (con->host_port, "unix:", 5) == 0)
+ cp = strchr (con->host_port+5, ':');
+ else
+ cp = strchr (con->host_port, '/');
if (cp)
cp++;
- }
+ }
if (cp)
{
c = cp;
if (c->cs)
{
+ yaz_log (LOG_DEBUG, "reconnect");
c->reconnect_ok = 1;
return;
}
+ yaz_log(LOG_DEBUG, "connect");
xfree (c->proxy);
val = ZOOM_options_get (c->options, "proxy");
if (val && *val)
return 0;
}
+static void otherInfo_attach (ZOOM_connection c, Z_APDU *a, ODR out)
+{
+ int i;
+ for (i = 0; i<200; i++)
+ {
+ size_t len;
+ Z_OtherInformation **oi;
+ char buf[20];
+ const char *val;
+ const char *cp;
+ int oidval;
+
+ sprintf (buf, "otherInfo%d", i);
+ val = ZOOM_options_get (c->options, buf);
+ if (!val)
+ break;
+ cp = strchr (val, ':');
+ if (!cp)
+ continue;
+ len = cp - val;
+ if (len >= sizeof(buf))
+ len = sizeof(buf)-1;
+ memcpy (buf, val, len);
+ buf[len] = '\0';
+ oidval = oid_getvalbyname (buf);
+ if (oidval == VAL_NONE)
+ continue;
+
+ yaz_oi_APDU(a, &oi);
+ yaz_oi_set_string_oidval(oi, out, oidval, 1, cp+1);
+ }
+}
+
static int encode_APDU(ZOOM_connection c, Z_APDU *a, ODR out)
{
assert (a);
yaz_oi_APDU(a, &oi);
yaz_oi_set_string_oidval(oi, out, VAL_CLIENT_IP, 1, c->client_IP);
}
+ otherInfo_attach (c, a, out);
if (!z_APDU(out, &a, 0, 0))
{
FILE *outf = fopen("/tmp/apdu.txt", "a");
if ((oi_unit = yaz_oi_update(oi, c->odr_out, NULL, 0, 0)))
{
- ODR_MASK_SET(ireq->options, Z_Options_negotiationModel);
-
- oi_unit->which = Z_OtherInfo_externallyDefinedInfo;
- oi_unit->information.externallyDefinedInfo =
- yaz_set_proposal_charneg(c->odr_out,
- (const char **)&c->charset, (c->charset) ? 1:0,
- (const char **)&c->lang, (c->lang) ? 1:0, 1);
+ ODR_MASK_SET(ireq->options, Z_Options_negotiationModel);
+
+ oi_unit->which = Z_OtherInfo_externallyDefinedInfo;
+ oi_unit->information.externallyDefinedInfo =
+ yaz_set_proposal_charneg
+ (c->odr_out,
+ (const char **)&c->charset, (c->charset) ? 1:0,
+ (const char **)&c->lang, (c->lang) ? 1:0, 1);
}
}
assert (apdu);
{
Z_InitResponse *initrs;
- yaz_log (LOG_DEBUG, "hande_apdu type=%d", apdu->which);
c->mask = 0;
+ yaz_log (LOG_DEBUG, "hande_apdu type=%d", apdu->which);
switch(apdu->which)
{
case Z_APDU_initResponse:
es_response (c, apdu->u.extendedServicesResponse);
ZOOM_connection_remove_task (c);
break;
+ case Z_APDU_close:
+ if (c->reconnect_ok)
+ {
+ do_close(c);
+ c->tasks->running = 0;
+ ZOOM_connection_insert_task (c, ZOOM_TASK_CONNECT);
+ }
+ else
+ {
+ c->error = ZOOM_ERROR_CONNECTION_LOST;
+ do_close(c);
+ }
+ break;
+ default:
+ c->error = ZOOM_ERROR_DECODE;
+ do_close(c);
}
}
else
{
ZOOM_Event event;
- c->reconnect_ok = 0;
odr_reset (c->odr_in);
odr_setbuf (c->odr_in, c->buf_in, r, 0);
event = ZOOM_Event_create (ZOOM_EVENT_RECV_APDU);
do_close (c);
}
else
- {
handle_apdu (c, apdu);
- }
+ c->reconnect_ok = 0;
}
return 1;
}
#if HAVE_SYS_POLL_H
#else
- tv.tv_sec = 15;
+ tv.tv_sec = 25;
tv.tv_usec = 0;
FD_ZERO (&input);
if (!nfds)
return 0;
#if HAVE_SYS_POLL_H
- r = poll (pollfds, nfds, 15000);
+ r = poll (pollfds, nfds, 25000);
for (i = 0; i<nfds; i++)
{
ZOOM_connection c = poll_cs[i];