/* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2008 Index Data
+ * Copyright (C) 1995-2009 Index Data
* See the file LICENSE for details.
*/
/** \file client.c
static FILE *apdu_file = 0;
static FILE *ber_file = 0;
static COMSTACK conn = 0; /* our z-association */
+
static Z_IdAuthentication *auth = 0; /* our current auth definition */
+static NMEM nmem_auth = NULL;
+
char *databaseNames[128];
int num_databaseNames = 0;
static Z_External *record_last = 0;
static int largeSetLowerBound = 1;
static int mediumSetPresentNumber = 0;
static Z_ElementSetNames *elementSetNames = 0;
-static int setno = 1; /* current set offset */
+static Odr_int setno = 1; /* current set offset */
static enum oid_proto protocol = PROTO_Z3950; /* current app protocol */
#define RECORDSYNTAX_MAX 20
static char *recordsyntax_list[RECORDSYNTAX_MAX];
static char last_cmd[32] = "?";
static FILE *marc_file = 0;
static char *refid = NULL;
-static char *last_open_command = NULL;
static int auto_reconnect = 0;
static int auto_wait = 1;
static Odr_bitmask z3950_options;
static void marc_file_write(const char *buf, size_t sz);
+static void wait_and_handle_response(int one_response_only);
+
ODR getODROutputStream(void)
{
return out;
int x;
for (i = 0; i < len ; i = i+16 )
{
- printf(" %4.4d ",i);
+ printf(" %4.4ld ", (long) i);
for(x=0 ; i+x<len && x<16; ++x)
{
printf("%2.2X ",(unsigned int)((unsigned char)buf[i+x]));
else
{
/* Peek at any private Init-diagnostic APDUs */
- printf("### NAUGHTY: External is '%.*s'\n",
- sat->len, sat->buf);
+ printf("yaz-client ignoring unrecognised userInformationField: %d-octet External '%.*s'\n",
+ (int) sat->len, sat->len, sat->buf);
}
}
odr_reset(print);
case Z_DiagnosticFormat_s_defaultDiagRec: {
Z_DefaultDiagFormat *dd = ds->u.defaultDiagRec;
/* ### should check `dd->diagnosticSetId' */
- printf("code=%d (%s)", *dd->condition,
+ printf("code=" ODR_INT_PRINTF " (%s)", *dd->condition,
diagbib1_str(*dd->condition));
/* Both types of addinfo are the same, so use type-pun */
if (dd->u.v2Addinfo != 0)
return set_base(arg);
}
-void cmd_open_remember_last_open_command(const char* arg, char* new_open_command)
-{
- if(last_open_command != arg)
- {
- if(last_open_command) xfree(last_open_command);
- last_open_command = xstrdup(new_open_command);
- }
-}
-
int session_connect(const char *arg)
{
void *add;
strncpy(type_and_host, arg, sizeof(type_and_host)-1);
type_and_host[sizeof(type_and_host)-1] = '\0';
- cmd_open_remember_last_open_command(arg, type_and_host);
-
if (yazProxy)
conn = cs_create_host(yazProxy, 1, &add);
else
return r;
}
-void try_reconnect(void)
-{
- char* open_command;
-
- if(!( auto_reconnect && last_open_command) ) return ;
-
- open_command = (char *) xmalloc(strlen(last_open_command)+6);
- strcpy(open_command, "open ");
-
- strcat(open_command, last_open_command);
-
- process_cmd_line(open_command);
-
- xfree(open_command);
-}
-
int cmd_authentication(const char *arg)
{
- static Z_IdAuthentication au;
- static char user[40], group[40], pass[40];
- static Z_IdPass idPass;
+ char **args;
int r;
- if (!*arg)
- {
- printf("Auth field set to null\n");
- auth = 0;
- return 1;
- }
- r = sscanf(arg, "%39s %39s %39s", user, group, pass);
+ nmem_reset(nmem_auth);
+ nmem_strsplit_blank(nmem_auth, arg, &args, &r);
+
if (r == 0)
{
printf("Authentication set to null\n");
auth = 0;
}
- if (r == 1)
+ else if (r == 1)
{
- auth = &au;
- if (!strcmp(user, "-")) {
- au.which = Z_IdAuthentication_anonymous;
+ auth = (Z_IdAuthentication *) nmem_malloc(nmem_auth, sizeof(*auth));
+ if (!strcmp(args[0], "-"))
+ {
+ auth->which = Z_IdAuthentication_anonymous;
+ auth->u.anonymous = odr_nullval();
printf("Authentication set to Anonymous\n");
- } else {
- au.which = Z_IdAuthentication_open;
- au.u.open = user;
- printf("Authentication set to Open (%s)\n", user);
+ }
+ else
+ {
+ auth->which = Z_IdAuthentication_open;
+ auth->u.open = args[0];
+ printf("Authentication set to Open (%s)\n", args[0]);
}
}
- if (r == 2)
- {
- auth = &au;
- au.which = Z_IdAuthentication_idPass;
- au.u.idPass = &idPass;
- idPass.groupId = NULL;
- idPass.userId = !strcmp(user, "-") ? 0 : user;
- idPass.password = !strcmp(group, "-") ? 0 : group;
- printf("Authentication set to User (%s), Pass (%s)\n", user, group);
+ else if (r == 2)
+ {
+ auth = (Z_IdAuthentication *) nmem_malloc(nmem_auth, sizeof(*auth));
+ auth->which = Z_IdAuthentication_idPass;
+ auth->u.idPass = (Z_IdPass *)
+ nmem_malloc(nmem_auth, sizeof(*auth->u.idPass));
+ auth->u.idPass->groupId = NULL;
+ auth->u.idPass->userId = !strcmp(args[0], "-") ? 0 : args[0];
+ auth->u.idPass->password = !strcmp(args[1], "-") ? 0 : args[1];
+ printf("Authentication set to User (%s), Pass (%s)\n",
+ args[0], args[1]);
+ }
+ else if (r == 3)
+ {
+ auth = (Z_IdAuthentication*) nmem_malloc(nmem_auth, sizeof(*auth));
+ auth->which = Z_IdAuthentication_idPass;
+ auth->u.idPass = (Z_IdPass *)
+ nmem_malloc(nmem_auth, sizeof(*auth->u.idPass));
+ auth->u.idPass->groupId = args[1];
+ auth->u.idPass->userId = args[0];
+ auth->u.idPass->password = args[2];
+ printf("Authentication set to User (%s), Group (%s), Pass (%s)\n",
+ args[0], args[1], args[2]);
}
- if (r == 3)
+ else
{
- auth = &au;
- au.which = Z_IdAuthentication_idPass;
- au.u.idPass = &idPass;
- idPass.groupId = group;
- idPass.userId = user;
- idPass.password = pass;
- printf("Authentication set to User (%s), Group (%s), Pass (%s)\n",
- user, group, pass);
+ printf("Bad number of args to auth\n");
+ auth = 0;
}
+
return 1;
}
{
print_record((const unsigned char *) r->u.octet_aligned->buf,
r->u.octet_aligned->len);
- marc_file_write(r->u.octet_aligned->buf, r->u.octet_aligned->len);
+ marc_file_write((const char *) r->u.octet_aligned->buf,
+ r->u.octet_aligned->len);
}
else if (oid && r->which == Z_External_octet)
{
return;
}
print_record(r->u.sutrs->buf, r->u.sutrs->len);
- marc_file_write(r->u.sutrs->buf, r->u.sutrs->len);
+ marc_file_write((const char *) r->u.sutrs->buf, r->u.sutrs->len);
}
else if (oid && !oid_oidcmp(oid, yaz_oid_recsyn_grs_1))
{
if (oid_oidcmp(r->diagnosticSetId, yaz_oid_diagset_bib_1))
printf("Unknown diagset: %s\n", diag_name);
}
- printf(" [%d] %s", *r->condition, diagbib1_str(*r->condition));
+ printf(" [" ODR_INT_PRINTF "] %s",
+ *r->condition, diagbib1_str(*r->condition));
switch (r->which)
{
case Z_DefaultDiagFormat_v2Addinfo:
names[0], names[1], names[2], names[3],
names[4], names[5], names[6], names[7]);
- req->deleteFunction = (int *)
- odr_malloc(out, sizeof(*req->deleteFunction));
+ req->deleteFunction = odr_intdup(out, 0);
if (req->num_resultSetList > 0)
{
*req->deleteFunction = Z_DeleteResultSetRequest_list;
printf("%s", term->u.characterString);
break;
case Z_Term_numeric:
- printf("%d", *term->u.numeric);
+ printf(ODR_INT_PRINTF, *term->u.numeric);
break;
case Z_Term_null:
printf("null");
display_queryExpression("recommendation",
sr->elements[j]->subqueryRecommendation);
if (sr->elements[j]->subqueryCount)
- printf(" cnt=%d", *sr->elements[j]->subqueryCount);
+ printf(" cnt=" ODR_INT_PRINTF,
+ *sr->elements[j]->subqueryCount);
if (sr->elements[j]->subqueryId)
printf(" id=%s ", sr->elements[j]->subqueryId);
}
printf("Search was a success.\n");
else
printf("Search was a bloomin' failure.\n");
- printf("Number of hits: %d", *res->resultCount);
+ printf("Number of hits: " ODR_INT_PRINTF, *res->resultCount);
last_hit_count = *res->resultCount;
if (setnumber >= 0)
printf(", setno %d", setnumber);
case Z_SearchResponse_estimate:
printf("estimate"); break;
default:
- printf("%d", *res->resultSetStatus);
+ printf(ODR_INT_PRINTF, *res->resultSetStatus);
}
putchar('\n');
}
display_searchResult(res->additionalSearchInfo);
- printf("records returned: %d\n",
+ printf("records returned: " ODR_INT_PRINTF "\n",
*res->numberOfRecordsReturned);
setno += *res->numberOfRecordsReturned;
if (res->records)
printf(" ");
}
-static void print_int(int iLevel, const char *pTag, int *pInt)
+static void print_int(int iLevel, const char *pTag, Odr_int *pInt)
+{
+ if (pInt != NULL)
+ {
+ print_level(iLevel);
+ printf("%s: " ODR_INT_PRINTF "\n", pTag, *pInt);
+ }
+}
+
+static void print_bool(int iLevel, const char *pTag, Odr_bool *pInt)
{
if (pInt != NULL)
{
{
printf("Received ResourceControlRequest.\n");
print_referenceId(1, req->referenceId);
- print_int(1, "Suspended Flag", req->suspendedFlag);
+ print_bool(1, "Suspended Flag", req->suspendedFlag);
print_int(1, "Partial Results Available", req->partialResultsAvailable);
- print_int(1, "Response Required", req->responseRequired);
- print_int(1, "Triggered Request Flag", req->triggeredRequestFlag);
+ print_bool(1, "Response Required", req->responseRequired);
+ print_bool(1, "Triggered Request Flag", req->triggeredRequestFlag);
print_external(1, req->resourceReport);
return 0;
}
r->u.itemOrder->u.esRequest->notToKeep->resultSetItem->resultSetId = "1";
r->u.itemOrder->u.esRequest->notToKeep->resultSetItem->item =
- (int *) odr_malloc(out, sizeof(int));
- *r->u.itemOrder->u.esRequest->notToKeep->resultSetItem->item = itemno;
-
+ odr_intdup(out, itemno);
if (!strcmp (type, "item") || !strcmp(type, "2"))
{
printf("using item-request\n");
}
toKeep->elementSetName = 0;
- toKeep->action = (int *) odr_malloc(out, sizeof(*toKeep->action));
- *toKeep->action = action_no;
+ toKeep->action = odr_intdup(out, action_no);
notToKeep = r->u.update0->u.esRequest->notToKeep = (Z_IU0SuppliedRecords *)
odr_malloc(out, sizeof(*r->u.update0->u.esRequest->notToKeep));
}
toKeep->elementSetName = 0;
toKeep->actionQualifier = 0;
- toKeep->action = (int *) odr_malloc(out, sizeof(*toKeep->action));
- *toKeep->action = action_no;
+ toKeep->action = odr_intdup(out, action_no);
notToKeep = r->u.update->u.esRequest->notToKeep = (Z_IUSuppliedRecords *)
odr_malloc(out, sizeof(*r->u.update->u.esRequest->notToKeep));
}
else
{
- if (!conn)
+ if (*cur_host && auto_reconnect)
{
- try_reconnect();
-
- if (!conn) {
- printf("Not connected yet\n");
- return 0;
+ int i = 0;
+ for (;;)
+ {
+ if (conn)
+ {
+ if (!send_searchRequest(arg))
+ return 0;
+ wait_and_handle_response(0);
+ if (conn)
+ break;
+ }
+ if (++i == 2)
+ {
+ printf("Unable to reconnect\n");
+ break;
+ }
+ session_connect(cur_host);
+ wait_and_handle_response(0);
}
+ return 0;
}
- if (!send_searchRequest(arg))
+ else if (conn)
+ {
+ if (!send_searchRequest(arg))
+ return 0;
+ }
+ else
+ {
+ printf("Not connected yet\n");
return 0;
+ }
}
return 2;
}
/* PRESENT SERVICE ----------------------------- */
static void parse_show_args(const char *arg_c, char *setstring,
- int *start, int *number)
+ Odr_int *start, Odr_int *number)
{
char arg[40];
char *p;
Z_APDU *apdu = zget_APDU(out, Z_APDU_presentRequest);
Z_PresentRequest *req = apdu->u.presentRequest;
Z_RecordComposition compo;
- int nos = 1;
+ Odr_int nos = 1;
char setstring[100];
req->referenceId = set_refid(out);
compo.u.simple = elementSetNames;
}
send_apdu(apdu);
- printf("Sent presentRequest (%d+%d).\n", setno, nos);
+ printf("Sent presentRequest (" ODR_INT_PRINTF "+" ODR_INT_PRINTF ").\n",
+ setno, nos);
return 2;
}
static int send_SRW_presentRequest(const char *arg)
{
char setstring[100];
- int nos = 1;
+ Odr_int nos = 1;
Z_SRW_PDU *sr = srw_sr;
if (!sr)
{
file_history_save(file_history);
file_history_destroy(&file_history);
+ nmem_destroy(nmem_auth);
exit(code);
}
}
int send_scanrequest(const char *set, const char *query,
- int pp, int num, const char *term)
+ Odr_int pp, Odr_int num, const char *term)
{
Z_APDU *apdu = zget_APDU(out, Z_APDU_scanRequest);
Z_ScanRequest *req = apdu->u.scanRequest;
t->term->u.general->buf);
if (t->globalOccurrences)
- printf(" (%d)\n", *t->globalOccurrences);
+ printf(" (" ODR_INT_PRINTF ")\n", *t->globalOccurrences);
else
printf("\n");
}
printf("Received ScanResponse\n");
print_refid(res->referenceId);
- printf("%d entries", *res->numberOfEntriesReturned);
+ printf(ODR_INT_PRINTF " entries", *res->numberOfEntriesReturned);
if (res->positionOfTerm)
- printf(", position=%d", *res->positionOfTerm);
+ printf(", position=" ODR_INT_PRINTF, *res->positionOfTerm);
printf("\n");
if (*res->scanStatus != Z_Scan_success)
- printf("Scan returned code %d\n", *res->scanStatus);
+ printf("Scan returned code " ODR_INT_PRINTF "\n", *res->scanStatus);
if (!res->entries)
return;
if ((entries = res->entries->entries))
case Z_SortResponse_failure:
printf("failure"); break;
default:
- printf("unknown (%d)", *res->sortStatus);
+ printf("unknown (" ODR_INT_PRINTF ")", *res->sortStatus);
}
printf("\n");
print_refid (res->referenceId);
void process_deleteResultSetResponse(Z_DeleteResultSetResponse *res)
{
- printf("Got deleteResultSetResponse status=%d\n",
+ printf("Got deleteResultSetResponse status=" ODR_INT_PRINTF "\n",
*res->deleteOperationStatus);
if (res->deleteListStatuses)
{
int i;
for (i = 0; i < res->deleteListStatuses->num; i++)
{
- printf("%s status=%d\n", res->deleteListStatuses->elements[i]->id,
- *res->deleteListStatuses->elements[i]->status);
+ printf("%s status=" ODR_INT_PRINTF "\n",
+ res->deleteListStatuses->elements[i]->id,
+ *res->deleteListStatuses->elements[i]->status);
}
}
}
}
else
{
- if (!conn)
+ if (*cur_host && !conn && auto_reconnect)
{
- try_reconnect();
-
- if (!conn) {
- printf("Session not initialized yet\n");
- return 0;
- }
+ session_connect(cur_host);
+ wait_and_handle_response(0);
}
+ if (!conn)
+ return 0;
if (session_initResponse &&
!ODR_MASK_GET(session_initResponse->options, Z_Options_scan))
{
return -1;
}
- while (!feof(includeFile)) {
- memset(line, 0, sizeof(line));
- if (!fgets(line, sizeof(line), includeFile))
- {
- perror("fgets");
- break;
- }
-
- if (strlen(line) < 2) continue;
- if (line[0] == '#') continue;
+ while (fgets(line, sizeof(line), includeFile))
+ {
+ if (strlen(line) < 2)
+ continue;
+ if (line[0] == '#')
+ continue;
if ((cp = strrchr(line, '\n')))
*cp = '\0';
{
if (rec->recordPosition)
{
- printf("pos=%d", *rec->recordPosition);
+ printf("pos=" ODR_INT_PRINTF, *rec->recordPosition);
setno = *rec->recordPosition + 1;
}
if (rec->recordSchema)
printf("\n");
if (rec->recordData_buf && rec->recordData_len)
{
- if (fwrite(rec->recordData_buf, 1, rec->recordData_len, stdout) !=
- (size_t) (rec->recordData_len))
- {
- printf("write to stdout failed\n");
- }
printf("%.*s", rec->recordData_len, rec->recordData_buf);
marc_file_write(rec->recordData_buf, rec->recordData_len);
}
printf("Details: %s\n", res->diagnostics[i].details);
}
if (res->numberOfRecords)
- printf("Number of hits: %d\n", *res->numberOfRecords);
+ printf("Number of hits: " ODR_INT_PRINTF "\n", *res->numberOfRecords);
for (i = 0; i<res->num_records; i++)
handle_srw_record(res->records + i);
}
else
printf("No value:");
if (term->numberOfRecords)
- printf(" %d", *term->numberOfRecords);
+ printf(" " ODR_INT_PRINTF, *term->numberOfRecords);
if (term->whereInList)
printf(" %s", term->whereInList);
if (term->value && term->displayTerm)
}
#endif
-void wait_and_handle_response(int one_response_only)
+static void wait_and_handle_response(int one_response_only)
{
int reconnect_ok = 1;
int res;
display_records(apdu->u.presentResponse->records);
else
printf("No records.\n");
- printf("nextResultSetPosition = %d\n",
+ printf("nextResultSetPosition = " ODR_INT_PRINTF "\n",
*apdu->u.presentResponse->nextResultSetPosition);
break;
case Z_APDU_sortResponse:
int i;
/* connection options */
- if(conn) {
- printf("Connected to : %s\n",last_open_command);
- } else {
- if(last_open_command)
- printf("Not connected to : %s\n",last_open_command);
- else
- printf("Not connected : \n");
-
- }
- if(yazProxy) printf("using proxy : %s\n",yazProxy);
+ if (conn)
+ printf("Connected to : %s\n", cur_host);
+ else if (*cur_host)
+ printf("Not connected to : %s\n", cur_host);
+ else
+ printf("Not connected : \n");
+ if (yazProxy) printf("using proxy : %s\n",yazProxy);
printf("auto_reconnect : %s\n",auto_reconnect?"on":"off");
printf("auto_wait : %s\n",auto_wait?"on":"off");
ODR_MASK_SET(&z3950_options, Z_Options_extendedServices);
ODR_MASK_SET(&z3950_options, Z_Options_delSet);
+ nmem_auth = nmem_create();
+
while ((ret = options("k:c:q:a:b:m:v:p:u:t:Vxd:f:", argv, argc, &arg)) != -2)
{
switch (ret)
/*
* Local variables:
* c-basic-offset: 4
+ * c-file-style: "Stroustrup"
* indent-tabs-mode: nil
* End:
* vim: shiftwidth=4 tabstop=8 expandtab