* Sebastian Hammer, Adam Dickmeiss
*
* $Log: seshigh.c,v $
- * Revision 1.47 1995-08-29 14:24:16 quinn
+ * Revision 1.63 1996-10-11 11:57:26 quinn
+ * Smallish
+ *
+ * Revision 1.62 1996/07/06 19:58:35 quinn
+ * System headerfiles gathered in yconfig
+ *
+ * Revision 1.61 1996/06/10 08:56:16 quinn
+ * Work on Summary.
+ *
+ * Revision 1.60 1996/05/30 11:03:10 quinn
+ * Fixed NextresultSetPosition bug fixed.
+ *
+ * Revision 1.59 1996/05/14 09:26:46 quinn
+ * Added attribute set to scan backend
+ *
+ * Revision 1.58 1996/02/20 12:53:04 quinn
+ * Chanes to SCAN
+ *
+ * Revision 1.57 1996/01/02 08:57:47 quinn
+ * Changed enums in the ASN.1 .h files to #defines. Changed oident.class to oclass
+ *
+ * Revision 1.56 1995/12/14 11:09:57 quinn
+ * Work on Explain
+ *
+ * Revision 1.55 1995/11/08 17:41:37 quinn
+ * Smallish.
+ *
+ * Revision 1.54 1995/11/08 15:11:29 quinn
+ * Log of close transmit.
+ *
+ * Revision 1.53 1995/11/01 13:54:58 quinn
+ * Minor adjustments
+ *
+ * Revision 1.52 1995/11/01 12:19:13 quinn
+ * Second attempt to fix same bug.
+ *
+ * Revision 1.50 1995/10/25 16:58:32 quinn
+ * Simple.
+ *
+ * Revision 1.49 1995/10/16 13:51:53 quinn
+ * Changes to provide Especs to the backend.
+ *
+ * Revision 1.48 1995/10/06 08:51:20 quinn
+ * Added Write-buffer.
+ *
+ * Revision 1.47 1995/08/29 14:24:16 quinn
* Added second half of close-handshake
*
* Revision 1.46 1995/08/29 11:17:58 quinn
* Updated External
*
* Revision 1.42 1995/08/15 11:16:50 quinn
- * CV:e ----------------------------------------------------------------------
- * CV:e ----------------------------------------------------------------------
*
* Revision 1.41 1995/08/02 10:23:06 quinn
* Smallish
*
*/
+#include <yconfig.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <assert.h>
-#include <sys/time.h>
-#include <dmalloc.h>
+#include <xmalloc.h>
#include <comstack.h>
#include <eventl.h>
#include <session.h>
if (!control_block)
control_block = statserv_getcontrol();
- if (!(new = malloc(sizeof(*new))))
+ if (!(new = xmalloc(sizeof(*new))))
return 0;
new->client_chan = channel;
new->client_link = link;
if (h->print)
odr_destroy(h->print);
if (h->input_buffer)
- free(h->input_buffer);
+ xfree(h->input_buffer);
if (h->backend)
bend_close(h->backend);
while (request_deq(&h->incoming));
while (request_deq(&h->outgoing));
- free(h);
+ xfree(h);
}
static void do_close(association *a, int reason, char *message)
while (request_deq(&a->outgoing));
if (a->version >= 3)
{
- logf(LOG_DEBUG, "Generating Close PDU");
+ logf(LOG_LOG, "Sending Close PDU, reason=%d, message=%s",
+ reason, message ? message : "none");
apdu.which = Z_APDU_close;
apdu.u.close = cls;
*cls->closeReason = reason;
odr_setbuf(assoc->decode, assoc->input_buffer, res, 0);
if (!z_APDU(assoc->decode, &req->request, 0))
{
- logf(LOG_LOG, "ODR error on incoming PDU: %s",
- odr_errlist[odr_geterror(assoc->decode)]);
+ logf(LOG_LOG, "ODR error on incoming PDU: %s [near byte %d] ",
+ odr_errlist[odr_geterror(assoc->decode)],
+ odr_offset(assoc->decode));
logf(LOG_LOG, "PDU dump:");
odr_dumpBER(log_file(), assoc->input_buffer, res);
do_close(assoc, Z_Close_protocolError, "Malformed package");
break;
case 0: /* all sent - release the request structure */
logf(LOG_DEBUG, "Wrote PDU, %d bytes", req->len_response);
- odr_release_mem(req->request_mem);
+ nmem_destroy(req->request_mem);
request_deq(&assoc->outgoing);
request_release(req);
if (!request_head(&assoc->outgoing))
{
logf(LOG_WARN, "ODR error when encoding response: %s",
odr_errlist[odr_geterror(assoc->decode)]);
+ odr_reset(assoc->encode);
return -1;
}
req->response = odr_getbuf(assoc->encode, &req->len_response,
&req->size_response);
- odr_setbuf(assoc->encode, 0, 0, 0); /* don't free if we abort later */
+ odr_setbuf(assoc->encode, 0, 0, 0); /* don'txfree if we abort later */
odr_reset(assoc->encode);
if (assoc->print && !z_APDU(assoc->print, &res, 0))
{
/*
* Handle init request.
- * At the moment, we don't check the protocol version or the options
+ * At the moment, we don't check the options
* anywhere else in the code - we just try not to do anything that would
* break a naive client. We'll toss 'em into the association block when
* we need them there.
#endif
bib1.proto = proto;
- bib1.class = CLASS_DIAGSET;
+ bib1.oclass = CLASS_DIAGSET;
bib1.value = VAL_BIB1;
logf(LOG_DEBUG, "Diagnostic: %d -- %s", error, addinfo ? addinfo :
#endif
bib1.proto = proto;
- bib1.class = CLASS_DIAGSET;
+ bib1.oclass = CLASS_DIAGSET;
bib1.value = VAL_BIB1;
logf(LOG_DEBUG, "SurrogateDiagnotic: %d -- %s", error, addinfo);
logf(LOG_DEBUG, "DiagRecs: %d -- %s", error, addinfo);
bib1.proto = proto;
- bib1.class = CLASS_DIAGSET;
+ bib1.oclass = CLASS_DIAGSET;
bib1.value = VAL_BIB1;
err = error;
#define MAX_RECORDS 256
static Z_Records *pack_records(association *a, char *setname, int start,
- int *num, Z_ElementSetNames *esn,
+ int *num, Z_RecordComposition *comp,
int *next, int *pres, oid_value format)
{
- int recno, total_length = 0, toget = *num;
+ int recno, total_length = 0, toget = *num, dumped_records = 0;
static Z_Records records;
static Z_NamePlusRecordList reclist;
static Z_NamePlusRecord *list[MAX_RECORDS];
* allocation done by the backend - this should give us a reasonable
* idea of the total size of the data so far.
*/
- total_length = odr_total(a->encode);
+ total_length = odr_total(a->encode) - dumped_records;
if (reclist.num_records == MAX_RECORDS - 1)
{
*pres = Z_PRES_PARTIAL_2;
}
freq.setname = setname;
freq.number = recno;
+ freq.comp = comp;
freq.format = format;
freq.stream = a->encode;
if (!(fres = bend_fetch(a->backend, &freq, 0)))
reclist.records[reclist.num_records] =
surrogatediagrec(a->proto, fres->basename, 16, 0);
reclist.num_records++;
+ *next = fres->last_in_set ? 0 : recno + 1;
+ dumped_records += this_length;
continue;
}
}
reclist.records[reclist.num_records] =
surrogatediagrec(a->proto, fres->basename, 17, 0);
reclist.num_records++;
+ *next = fres->last_in_set ? 0 : recno + 1;
+ dumped_records += this_length;
continue;
}
}
sizeof(Z_DatabaseRecord))))
return 0;
recform.proto = a->proto;
- recform.class = CLASS_RECSYN;
+ recform.oclass = CLASS_RECSYN;
recform.value = fres->format;
thisext->direct_reference = odr_oiddup(a->encode,
oid_getoidbyent(&recform));
case VAL_GRS1: thisext->which = Z_External_grs1; break;
case VAL_EXPLAIN: thisext->which = Z_External_explainRecord;
break;
+ case VAL_SUMMARY: thisext->which = Z_External_summary; break;
+ case VAL_OPAC: thisext->which = Z_External_OPAC; break;
default:
logf(LOG_FATAL, "Unknown structured format from backend.");
else
{
static int toget;
- Z_ElementSetNames *setnames;
+ Z_RecordComposition comp, *compp = 0;
static int presst = 0;
resp.records = 0;
resp.resultCount = &bsrt->hits;
+ comp.which = Z_RecordComp_simple;
/* how many records does the user agent want, then? */
if (bsrt->hits <= *req->smallSetUpperBound)
{
toget = bsrt->hits;
- setnames = req->smallSetElementSetNames;
+ if ((comp.u.simple = req->smallSetElementSetNames))
+ compp = ∁
}
else if (bsrt->hits < *req->largeSetLowerBound)
{
toget = *req->mediumSetPresentNumber;
if (toget > bsrt->hits)
toget = bsrt->hits;
- setnames = req->mediumSetElementSetNames;
+ if ((comp.u.simple = req->mediumSetElementSetNames))
+ compp = ∁
}
else
toget = 0;
oid_value form;
if (!(prefformat = oid_getentbyoid(req->preferredRecordSyntax)) ||
- prefformat->class != CLASS_RECSYN)
+ prefformat->oclass != CLASS_RECSYN)
form = VAL_NONE;
else
form = prefformat->value;
resp.records = pack_records(assoc, req->resultSetName, 1,
- &toget, setnames, &next, &presst, form);
+ &toget, compp, &next, &presst, form);
if (!resp.records)
return 0;
resp.numberOfRecordsReturned = &toget;
#endif
if (!(prefformat = oid_getentbyoid(req->preferredRecordSyntax)) ||
- prefformat->class != CLASS_RECSYN)
+ prefformat->oclass != CLASS_RECSYN)
form = VAL_NONE;
else
form = prefformat->value;
num = *req->numberOfRecordsRequested;
resp.records = pack_records(assoc, req->resultSetId,
- *req->resultSetStartPoint, &num, 0, &next, &presst, form);
+ *req->resultSetStartPoint, &num, req->recordComposition, &next,
+ &presst, form);
if (!resp.records)
return 0;
resp.numberOfRecordsReturned = #
static Z_Entry *tab[SCAN_MAX_ENTRIES];
bend_scanrequest srq;
bend_scanresult *srs;
+ oident *attset;
logf(LOG_LOG, "Got scanrequest");
apdu.which = Z_APDU_scanResponse;
#endif
if (req->attributeSet && (!(attent = oid_getentbyoid(req->attributeSet)) ||
- attent->class != CLASS_ATTSET || attent->value != VAL_BIB1))
+ attent->oclass != CLASS_ATTSET || attent->value != VAL_BIB1))
ents.u.nonSurrogateDiagnostics = diagrecs(assoc->proto, 121, 0);
else if (req->stepSize && *req->stepSize > 0)
ents.u.nonSurrogateDiagnostics = diagrecs(assoc->proto, 205, 0);
srq.basenames = req->databaseNames;
srq.num_entries = *req->numberOfTermsRequested;
srq.term = req->termListAndStartPoint;
+ if (!(attset = oid_getentbyoid(req->attributeSet)) ||
+ attset->oclass != CLASS_RECSYN)
+ srq.attributeset = VAL_NONE;
+ else
+ srq.attributeset = attset->value;
srq.term_position = req->preferredPositionInResponse ?
*req->preferredPositionInResponse : 1;
if (!(srs = bend_scan(assoc->backend, &srq, 0)))
e->which = Z_Entry_termInfo;
e->u.termInfo = t = odr_malloc(assoc->encode, sizeof(*t));
t->suggestedAttributes = 0;
+ t->displayTerm = 0;
t->alternativeTerm = 0;
t->byAttributes = 0;
+ t->otherTermInfo = 0;
t->globalOccurrences = &srs->entries[i].occurrences;
t->term = odr_malloc(assoc->encode, sizeof(*t->term));
t->term->which = Z_Term_general;