* Sebastian Hammer, Adam Dickmeiss
*
* $Log: seshigh.c,v $
- * Revision 1.34 1995-06-14 15:26:46 quinn
+ * Revision 1.40 1995-07-31 14:34:26 quinn
+ * Fixed bug in process_searchResponse (numberOfRecordsReturned).
+ *
+ * Revision 1.39 1995/06/27 13:21:00 quinn
+ * SUTRS support
+ *
+ * Revision 1.38 1995/06/19 12:39:11 quinn
+ * Fixed bug in timeout code. Added BER dumper.
+ *
+ * Revision 1.37 1995/06/16 13:16:14 quinn
+ * Fixed Defaultdiagformat.
+ *
+ * Revision 1.36 1995/06/16 10:31:36 quinn
+ * Added session timeout.
+ *
+ * Revision 1.35 1995/06/15 07:45:14 quinn
+ * Moving to v3.
+ *
+ * Revision 1.34 1995/06/14 15:26:46 quinn
* *** empty log message ***
*
* Revision 1.33 1995/06/06 14:57:05 quinn
request *req;
assert(h && conn && assoc);
+ if (event == EVENT_TIMEOUT)
+ {
+ logf(LOG_LOG, "Timeout - closing connection.");
+ cs_close(conn);
+ destroy_association(assoc);
+ iochan_destroy(h);
+ return;
+ }
if (event & EVENT_INPUT || event & EVENT_WORK) /* input */
{
if (event & EVENT_INPUT)
odr_setbuf(assoc->decode, assoc->input_buffer, res, 0);
if (!z_APDU(assoc->decode, &req->request, 0))
{
- logf(LOG_WARN, "ODR error: %s",
+ logf(LOG_LOG, "ODR error on incoming PDU: %s",
odr_errlist[odr_geterror(assoc->decode)]);
+ logf(LOG_LOG, "PDU dump:");
+ odr_dumpBER(log_file(), assoc->input_buffer, res);
cs_close(conn);
destroy_association(assoc);
iochan_destroy(h);
{
static Z_Records rec;
oident bib1;
- static Z_DiagRec dr;
static int err;
+#ifdef Z_95
+ static Z_DiagRec drec;
+ static Z_DefaultDiagFormat dr;
+#else
+ static Z_DiagRec dr;
+#endif
bib1.proto = proto;
bib1.class = CLASS_DIAGSET;
"NULL");
err = error;
rec.which = Z_Records_NSD;
+#ifdef Z_95
+ rec.u.nonSurrogateDiagnostic = &drec;
+ drec.which = Z_DiagRec_defaultFormat;
+ drec.u.defaultFormat = &dr;
+#else
rec.u.nonSurrogateDiagnostic = &dr;
+#endif
dr.diagnosticSetId = oid_getoidbyent(&bib1);
dr.condition = &err;
+ dr.which = Z_DiagForm_v2AddInfo;
dr.addinfo = addinfo ? addinfo : "";
return &rec;
}
int error, char *addinfo)
{
static Z_NamePlusRecord rec;
- static Z_DiagRec dr;
static int err;
oident bib1;
+#ifdef Z_95
+ static Z_DiagRec drec;
+ static Z_DefaultDiagFormat dr;
+#else
+ static Z_DiagRec dr;
+#endif
bib1.proto = proto;
bib1.class = CLASS_DIAGSET;
err = error;
rec.databaseName = dbname;
rec.which = Z_NamePlusRecord_surrogateDiagnostic;
+#ifdef Z_95
+ rec.u.surrogateDiagnostic = &drec;
+ drec.which = Z_DiagRec_defaultFormat;
+ drec.u.defaultFormat = &dr;
+#else
rec.u.surrogateDiagnostic = &dr;
+#endif
dr.diagnosticSetId = oid_getoidbyent(&bib1);
dr.condition = &err;
+ dr.which = Z_DiagForm_v2AddInfo;
dr.addinfo = addinfo ? addinfo : "";
return &rec;
}
static Z_DiagRecs *diagrecs(oid_proto proto, int error, char *addinfo)
{
static Z_DiagRecs recs;
- static Z_DiagRec *recp[1], rec;
static int err;
oident bib1;
+#ifdef Z_95
+ static Z_DiagRec *recp[1], drec;
+ static Z_DefaultDiagFormat rec;
+#else
+ static Z_DiagRec *recp[1], rec;
+#endif
logf(LOG_DEBUG, "DiagRecs: %d -- %s", error, addinfo);
bib1.proto = proto;
err = error;
recs.num_diagRecs = 1;
recs.diagRecs = recp;
+#ifdef Z_95
+ recp[0] = &drec;
+ drec.which = Z_DiagRec_defaultFormat;
+ drec.u.defaultFormat = &rec;
+#else
recp[0] = &rec;
+#endif
rec.diagnosticSetId = oid_getoidbyent(&bib1);
rec.condition = &err;
+ rec.which = Z_DiagForm_v2AddInfo;
rec.addinfo = addinfo ? addinfo : "";
return &recs;
}
static Z_Records *pack_records(association *a, char *setname, int start,
int *num, Z_ElementSetNames *esn,
- int *next, int *pres)
+ int *next, int *pres, oid_value format)
{
int recno, total_length = 0, toget = *num;
static Z_Records records;
static Z_NamePlusRecordList reclist;
static Z_NamePlusRecord *list[MAX_RECORDS];
oident recform;
- Odr_oid *oid;
records.which = Z_Records_DBOSD;
records.u.databaseOrSurDiagnostics = &reclist;
*num = 0;
*next = 0;
- recform.proto = a->proto;
- recform.class = CLASS_RECSYN;
- recform.value = VAL_USMARC;
- if (!(oid = odr_oiddup(a->encode, oid_getoidbyent(&recform))))
- return 0;
-
logf(LOG_DEBUG, "Request to pack %d+%d", start, toget);
logf(LOG_DEBUG, "pms=%d, mrs=%d", a->preferredMessageSize,
a->maximumRecordSize);
}
freq.setname = setname;
freq.number = recno;
+ freq.format = format;
if (!(fres = bend_fetch(a->backend, &freq, 0)))
{
*pres = Z_PRES_FAILURE;
if (!(thisrec->u.databaseRecord = thisext = odr_malloc(a->encode,
sizeof(Z_DatabaseRecord))))
return 0;
- thisext->direct_reference = oid; /* should be OID for current MARC */
+ recform.proto = a->proto;
+ recform.class = CLASS_RECSYN;
+ recform.value = fres->format;
+ thisext->direct_reference = odr_oiddup(a->encode,
+ oid_getoidbyent(&recform));
thisext->indirect_reference = 0;
thisext->descriptor = 0;
- thisext->which = ODR_EXTERNAL_octet;
- if (!(thisext->u.octet_aligned = odr_malloc(a->encode,
- sizeof(Odr_oct))))
- return 0;
- if (!(thisext->u.octet_aligned->buf = odr_malloc(a->encode, fres->len)))
- return 0;
- memcpy(thisext->u.octet_aligned->buf, fres->record, fres->len);
- thisext->u.octet_aligned->len = thisext->u.octet_aligned->size =
- fres->len;
+ if (fres->format == VAL_SUTRS) /* SUTRS ios a single-ASN.1-type */
+ {
+ Odr_oct sutrs_asn;
+ Odr_oct *sp = &sutrs_asn;
+ Odr_any *single = odr_malloc(a->encode, sizeof(*single));
+ char *buf, *remember;
+ int len, s_remember;
+
+ sutrs_asn.buf = (unsigned char*) fres->record;
+ sutrs_asn.len = sutrs_asn.size = fres->len;
+ /*
+ * we borrow the encoding stream for preparing the buffer. This
+ * is not the most elegant solution - a better way might have been
+ * to reserve a different stream, or to devise a better system
+ * for handling externals in general.
+ */
+ remember = odr_getbuf(a->encode, &len, &s_remember);
+ buf = odr_malloc(a->encode, fres->len + 10); /* buf for encoding */
+ odr_setbuf(a->encode, buf, fres->len + 10, 0); /* can_grow==0 */
+ if (!z_SUTRS(a->encode, &sp, 0))
+ {
+ logf(LOG_LOG, "ODR error encoding SUTRS: %s",
+ odr_errlist[odr_geterror(a->encode)]);
+ return 0;
+ }
+ thisext->which = ODR_EXTERNAL_single;
+ thisext->u.single_ASN1_type = single;
+ single->buf = (unsigned char*)odr_getbuf(a->encode, &single->len,
+ &single->size);
+ /* Now restore the encoding stream */
+ odr_setbuf(a->encode, remember, s_remember, 1);
+ logf(LOG_DEBUG, " Format is SUTRS. len %d, encoded len %d",
+ fres->len, single->len);
+ }
+ else /* octet-aligned record. Easy as pie */
+ {
+ thisext->which = ODR_EXTERNAL_octet;
+ if (!(thisext->u.octet_aligned = odr_malloc(a->encode,
+ sizeof(Odr_oct))))
+ return 0;
+ if (!(thisext->u.octet_aligned->buf = odr_malloc(a->encode,
+ fres->len)))
+ return 0;
+ memcpy(thisext->u.octet_aligned->buf, fres->record, fres->len);
+ thisext->u.octet_aligned->len = thisext->u.octet_aligned->size =
+ fres->len;
+ }
reclist.records[reclist.num_records] = thisrec;
reclist.num_records++;
total_length += fres->len;
apdu.which = Z_APDU_searchResponse;
apdu.u.searchResponse = &resp;
resp.referenceId = req->referenceId;
+#ifdef Z_95
+ resp.additionalSearchInfo = 0;
+ resp.otherInfo = 0;
+#endif
*fd = -1;
if (!bsrt && !(bsrt = bend_searchresponse(assoc->backend)))
{
}
else
{
- int toget;
+ static int toget;
Z_ElementSetNames *setnames;
- int presst = 0;
+ static int presst = 0;
resp.records = 0;
resp.resultCount = &bsrt->hits;
if (toget && !resp.records)
{
+ oident *prefformat;
+ oid_value form;
+
+ if (!(prefformat = oid_getentbyoid(req->preferredRecordSyntax)) ||
+ prefformat->class != CLASS_RECSYN)
+ form = VAL_NONE;
+ else
+ form = prefformat->value;
resp.records = pack_records(assoc, req->resultSetName, 1,
- &toget, setnames, &next, &presst);
+ &toget, setnames, &next, &presst, form);
if (!resp.records)
return 0;
resp.numberOfRecordsReturned = &toget;
static Z_APDU apdu;
static Z_PresentResponse resp;
static int presst, next, num;
+ oident *prefformat;
+ oid_value form;
+
logf(LOG_LOG, "Got PresentRequest.");
apdu.which = Z_APDU_presentResponse;
apdu.u.presentResponse = &resp;
resp.referenceId = req->referenceId;
+#ifdef Z_95
+ resp.otherInfo = 0;
+#endif
+ if (!(prefformat = oid_getentbyoid(req->preferredRecordSyntax)) ||
+ prefformat->class != CLASS_RECSYN)
+ form = VAL_NONE;
+ else
+ form = prefformat->value;
num = *req->numberOfRecordsRequested;
resp.records = pack_records(assoc, req->resultSetId,
- *req->resultSetStartPoint, &num, req->elementSetNames, &next, &presst);
+ *req->resultSetStartPoint, &num, 0, &next, &presst, form);
if (!resp.records)
return 0;
resp.numberOfRecordsReturned = #
res.entries = &ents;
ents.which = Z_ListEntries_nonSurrogateDiagnostics;
res.attributeSet = 0;
+#ifdef Z_95
+ res.otherInfo = 0;
+#endif
if (req->attributeSet && (!(attent = oid_getentbyoid(req->attributeSet)) ||
attent->class != CLASS_ATTSET || attent->value != VAL_BIB1))