* Sebastian Hammer, Adam Dickmeiss
*
* $Log: client.c,v $
- * Revision 1.59 1998-01-29 13:17:56 adam
+ * Revision 1.63 1998-03-05 08:05:10 adam
+ * Added a few casts to make C++ happy.
+ *
+ * Revision 1.62 1998/02/11 11:53:33 adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.61 1998/02/10 11:03:06 adam
+ * Implemented command refid. Client prints reference-ID's, when present,
+ * in responses.
+ *
+ * Revision 1.60 1998/01/29 14:08:52 adam
+ * Better sort diagnostics.
+ *
+ * Revision 1.59 1998/01/29 13:17:56 adam
* Added sort.
*
* Revision 1.58 1998/01/07 13:51:45 adam
static char last_scan[512] = "0";
static char last_cmd[100] = "?";
static FILE *marcdump = 0;
+static char *refid = NULL;
typedef enum {
QueryType_Prefix,
exit(1);
}
buf = odr_getbuf(out, &len, 0);
- odr_reset(out); /* release the APDU structure */
if (cs_put(conn, buf, len) < 0)
{
fprintf(stderr, "cs_put: %s", cs_errmsg(cs_errno(conn)));
exit(1);
}
+ odr_reset(out); /* release the APDU structure */
}
+static void print_refid (Z_ReferenceId *id)
+{
+ if (id)
+ {
+ printf ("ReferenceId: '%.*s'\n", id->len, id->buf);
+ }
+}
+
+static Z_ReferenceId *set_refid (ODR out)
+{
+ Z_ReferenceId *id;
+ if (!refid)
+ return 0;
+ id = (Z_ReferenceId *) odr_malloc (out, sizeof(*id));
+ id->size = id->len = strlen(refid);
+ id->buf = (unsigned char *) odr_malloc (out, id->len);
+ memcpy (id->buf, refid, id->len);
+ return id;
+}
+
/* INIT SERVICE ------------------------------- */
static void send_initRequest()
*/
odr_setbuf(in, (char*)p->u.octet_aligned->buf,
p->u.octet_aligned->len, 0);
- if (!(*type->fun)(in, &rr, 0))
+ if (!(*type->fun)(in, (char **)&rr, 0))
{
odr_perror(in, "Decoding constructed record.");
fprintf(stderr, "[Near %d]\n", odr_offset(in));
* Note: we throw away the original, BER-encoded record here.
* Do something else with it if you want to keep it.
*/
- r->u.sutrs = rr; /* we don't actually check the type here. */
+ r->u.sutrs = (Odr_oct *)rr; /* we don't actually check the type here. */
r->which = type->what;
}
}
}
}
#endif
-
+ req->referenceId = set_refid (out);
if (!strcmp(arg, "@big")) /* strictly for troublemaking */
{
static unsigned char big[2100];
bigo.buf = big;
req->referenceId = &bigo;
}
-
+
if (setnumber >= 0)
{
sprintf(setstring, "%d", ++setnumber);
static int process_searchResponse(Z_SearchResponse *res)
{
+ printf ("Received SearchResponse.\n");
+ print_refid (res->referenceId);
if (*res->searchStatus)
printf("Search was a success.\n");
else
return 0;
}
+static int process_resourceControlRequest (Z_ResourceControlRequest *req)
+{
+ printf ("Received ResourceControlRequest.\n");
+ print_refid (req->referenceId);
+ return 0;
+}
+
static int cmd_find(char *arg)
{
if (!*arg)
cp = arg + strlen(arg);
if (cp - arg < 1)
break;
- databaseNames[num_databaseNames] = xmalloc (1 + cp - arg);
+ databaseNames[num_databaseNames] = (char *)xmalloc (1 + cp - arg);
memcpy (databaseNames[num_databaseNames], arg, cp - arg);
databaseNames[num_databaseNames++][cp - arg] = '\0';
if (!*cp)
char *p;
char setstring[100];
+ req->referenceId = set_refid (out);
if ((p = strchr(arg, '+')))
{
nos = atoi(p + 1);
Z_APDU *apdu = zget_APDU(out, Z_APDU_scanRequest);
Z_ScanRequest *req = apdu->u.scanRequest;
+ req->referenceId = set_refid (out);
req->num_databaseNames = num_databaseNames;
req->databaseNames = databaseNames;
req->termListAndStartPoint = p_query_scan(out, protocol,
{
Z_APDU *apdu = zget_APDU(out, Z_APDU_sortRequest);
Z_SortRequest *req = apdu->u.sortRequest;
- Z_SortKeySpecList *sksl = odr_malloc (out, sizeof(*sksl));
+ Z_SortKeySpecList *sksl = (Z_SortKeySpecList *)odr_malloc (out, sizeof(*sksl));
char setstring[32];
char sort_string[32], sort_flags[32];
int off;
else
sprintf (setstring, "default");
+ req->referenceId = set_refid (out);
+
req->inputResultSetNames =
- odr_malloc (out, sizeof(*req->inputResultSetNames));
+ (Z_StringList *)odr_malloc (out, sizeof(*req->inputResultSetNames));
req->inputResultSetNames->num_strings = 1;
req->inputResultSetNames->strings =
- odr_malloc (out, sizeof(*req->inputResultSetNames->strings));
+ (char **)odr_malloc (out, sizeof(*req->inputResultSetNames->strings));
req->inputResultSetNames->strings[0] =
- odr_malloc (out, strlen(setstring)+1);
+ (char *)odr_malloc (out, strlen(setstring)+1);
strcpy (req->inputResultSetNames->strings[0], setstring);
if (newset && setnumber >= 0)
sprintf (setstring, "%d", ++setnumber);
- req->sortedResultSetName = odr_malloc (out, strlen(setstring)+1);
+ req->sortedResultSetName = (char *)odr_malloc (out, strlen(setstring)+1);
strcpy (req->sortedResultSetName, setstring);
req->sortSequence = sksl;
sksl->num_specs = 0;
- sksl->specs = odr_malloc (out, sizeof(sksl->specs) * 20);
+ sksl->specs = (Z_SortKeySpec **)odr_malloc (out, sizeof(sksl->specs) * 20);
bib1.proto = protocol;
bib1.oclass = CLASS_ATTSET;
bib1.value = VAL_BIB1;
- while ((sscanf (arg, "%31s %31s%n", sort_string, sort_flags, &off)) == 2)
+ while ((sscanf (arg, "%31s %31s%n", sort_string, sort_flags, &off)) == 2
+ && off > 1)
{
int i;
char *sort_string_sep;
- Z_SortKeySpec *sks = odr_malloc (out, sizeof(*sks));
- Z_SortKey *sk = odr_malloc (out, sizeof(*sk));
+ Z_SortKeySpec *sks = (Z_SortKeySpec *)odr_malloc (out, sizeof(*sks));
+ Z_SortKey *sk = (Z_SortKey *)odr_malloc (out, sizeof(*sk));
arg += off;
sksl->specs[sksl->num_specs++] = sks;
- sks->sortElement = odr_malloc (out, sizeof(*sks->sortElement));
+ sks->sortElement = (Z_SortElement *)odr_malloc (out, sizeof(*sks->sortElement));
sks->sortElement->which = Z_SortElement_generic;
sks->sortElement->u.generic = sk;
if ((sort_string_sep = strchr (sort_string, '=')))
{
- Z_AttributeElement *el = odr_malloc (out, sizeof(*el));
+ Z_AttributeElement *el = (Z_AttributeElement *)odr_malloc (out, sizeof(*el));
sk->which = Z_SortKey_sortAttributes;
sk->u.sortAttributes =
- odr_malloc (out, sizeof(*sk->u.sortAttributes));
+ (Z_SortAttributes *)odr_malloc (out, sizeof(*sk->u.sortAttributes));
sk->u.sortAttributes->id = oid_ent_to_oid(&bib1, oid);
sk->u.sortAttributes->list =
- odr_malloc (out, sizeof(*sk->u.sortAttributes->list));
+ (Z_AttributeList *)odr_malloc (out, sizeof(*sk->u.sortAttributes->list));
sk->u.sortAttributes->list->num_attributes = 1;
sk->u.sortAttributes->list->attributes =
- odr_malloc (out,
+ (Z_AttributeElement **)odr_malloc (out,
sizeof(*sk->u.sortAttributes->list->attributes));
sk->u.sortAttributes->list->attributes[0] = el;
el->attributeSet = 0;
- el->attributeType = odr_malloc (out, sizeof(*el->attributeType));
+ el->attributeType = (int *)odr_malloc (out, sizeof(*el->attributeType));
*el->attributeType = atoi (sort_string);
el->which = Z_AttributeValue_numeric;
- el->value.numeric = odr_malloc (out, sizeof(*el->value.numeric));
+ el->value.numeric = (int *)odr_malloc (out, sizeof(*el->value.numeric));
*el->value.numeric = atoi (sort_string_sep + 1);
}
else
{
sk->which = Z_SortKey_sortField;
- sk->u.sortField = odr_malloc (out, strlen(sort_string)+1);
+ sk->u.sortField = (char *)odr_malloc (out, strlen(sort_string)+1);
strcpy (sk->u.sortField, sort_string);
}
- sks->sortRelation = odr_malloc (out, sizeof(*sks->sortRelation));
+ sks->sortRelation = (int *)odr_malloc (out, sizeof(*sks->sortRelation));
*sks->sortRelation = Z_SortRelation_ascending;
- sks->caseSensitivity = odr_malloc (out, sizeof(*sks->caseSensitivity));
+ sks->caseSensitivity = (int *)odr_malloc (out, sizeof(*sks->caseSensitivity));
*sks->caseSensitivity = Z_SortCase_caseSensitive;
sks->missingValueAction = NULL;
}
}
if (!sksl->num_specs)
- return 0;
+ {
+ printf ("Missing sort specifications\n");
+ return -1;
+ }
send_apdu(apdu);
return 2;
}
void process_scanResponse(Z_ScanResponse *res)
{
int i;
-
- printf("SCAN: %d entries, position=%d\n", *res->numberOfEntriesReturned,
- *res->positionOfTerm);
+
+ printf("Received ScanResponse\n");
+ print_refid (res->referenceId);
+ printf("%d entries", *res->numberOfEntriesReturned);
+ if (res->positionOfTerm)
+ printf (", position=%d", *res->positionOfTerm);
+ printf ("\n");
if (*res->scanStatus != Z_Scan_success)
printf("Scan returned code %d\n", *res->scanStatus);
if (!res->entries)
void process_sortResponse(Z_SortResponse *res)
{
- printf("Sort: status=");
+ printf("Received SortResponse: status=");
switch (*res->sortStatus)
{
case Z_SortStatus_success:
printf ("unknown (%d)", *res->sortStatus);
}
printf ("\n");
+ print_refid (res->referenceId);
if (res->diagnostics)
display_diagrecs(res->diagnostics->diagRecs,
res->diagnostics->num_diagRecs);
return 1;
}
+int cmd_refid (char *arg)
+{
+ xfree (refid);
+ refid = NULL;
+ if (*arg)
+ {
+ refid = (char *) xmalloc (strlen(arg)+1);
+ strcpy (refid, arg);
+ }
+ return 1;
+}
+
int cmd_close(char *arg)
{
Z_APDU *apdu = zget_APDU(out, Z_APDU_close);
{"close", cmd_close, ""},
{"attributeset", cmd_attributeset, "<attrset>"},
{"querytype", cmd_querytype, "<type>"},
+ {"refid", cmd_refid, "<id>"},
{0,0}
};
char *netbuffer= 0;
continue;
}
}
+ wait = 0;
#ifdef USE_SELECT
if (conn && FD_ISSET(cs_fileno(conn), &input))
#endif
process_scanResponse(apdu->u.scanResponse);
break;
case Z_APDU_presentResponse:
+ print_refid (apdu->u.presentResponse->referenceId);
setno +=
*apdu->u.presentResponse->numberOfRecordsReturned;
if (apdu->u.presentResponse->records)
printf("Target has closed the association.\n");
process_close(apdu->u.close);
break;
+ case Z_APDU_resourceControlRequest:
+ process_resourceControlRequest
+ (apdu->u.resourceControlRequest);
+ break;
default:
printf("Received unknown APDU type (%d).\n",
apdu->which);
exit(1);
}
- printf(C_PROMPT);
- fflush(stdout);
}
while (cs_more(conn));
+ printf(C_PROMPT);
+ fflush(stdout);
}
- wait = 0;
}
return 0;
}