X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=client%2Fclient.c;h=bb3b465a4c7cc69707165e6bb38f7c8f2401c7b7;hp=ad98a3a64a622db1252b0d7390c45d4f8685cad9;hb=650cc0539b6a484eba203949cb43a08b9084504d;hpb=786269f1247effe4194494c834b5d7043417d0d5 diff --git a/client/client.c b/client/client.c index ad98a3a..bb3b465 100644 --- a/client/client.c +++ b/client/client.c @@ -1,13 +1,28 @@ -/* - * Copyright (c) 1995-2002, Index Data +/* + * Copyright (c) 1995-2003, Index Data * See the file LICENSE for details. * - * $Id: client.c,v 1.166 2002-09-02 13:59:07 adam Exp $ + * $Id: client.c,v 1.179 2003-01-27 21:31:35 adam Exp $ */ #include #include +#if HAVE_LOCALE_H +#include +#endif + +#if HAVE_LANGINFO_H +#include +#endif + #include +#include + +#ifdef WIN32 +#include +#define S_ISREG(x) (x & _S_IFREG) +#define S_ISDIR(x) (x & _S_IFDIR) +#endif #include @@ -42,6 +57,8 @@ #define C_PROMPT "Z> " +static char *codeset = 0; /* character set for output */ + static ODR out, in, print; /* encoding and decoding streams */ static FILE *apdu_file = 0; static COMSTACK conn = 0; /* our z-association */ @@ -49,7 +66,7 @@ static Z_IdAuthentication *auth = 0; /* our current auth definition */ char *databaseNames[128]; int num_databaseNames = 0; static Z_External *record_last = 0; -static int setnumber = -1; /* current result set number */ +static int setnumber = -1; /* current result set number */ static int smallSetUpperBound = 0; static int largeSetLowerBound = 1; static int mediumSetPresentNumber = 0; @@ -59,7 +76,7 @@ static enum oid_proto protocol = PROTO_Z3950; /* current app protocol */ static enum oid_value recordsyntax = VAL_USMARC; static enum oid_value schema = VAL_NONE; static int sent_close = 0; -static NMEM session_mem = NULL; /* memory handle for init-response */ +static NMEM session_mem = NULL; /* memory handle for init-response */ static Z_InitResponse *session = 0; /* session parameters */ static char last_scan_line[512] = "0"; static char last_scan_query[512] = "0"; @@ -80,7 +97,8 @@ static int auto_reconnect = 0; typedef enum { QueryType_Prefix, QueryType_CCL, - QueryType_CCL2RPN + QueryType_CCL2RPN, + QueryType_CQL } QueryType; static QueryType queryType = QueryType_Prefix; @@ -106,7 +124,7 @@ int rl_attempted_completion_over = 0; #define maxOtherInfosSupported 10 struct { int oidval; - char* value; + char* value; } extraOtherInfos[maxOtherInfosSupported]; @@ -123,54 +141,53 @@ ODR getODROutputStream() const char* query_type_as_string(QueryType q) { - switch (q) { - case QueryType_Prefix: return "prefix (RPN sent to server)"; - case QueryType_CCL: return "CCL (CCL sent to server) "; - case QueryType_CCL2RPN: return "CCL -> RPN (RPN sent to server)"; - default: - return "unknown Query type internal yaz-client error"; - }; -}; + switch (q) { + case QueryType_Prefix: return "prefix (RPN sent to server)"; + case QueryType_CCL: return "CCL (CCL sent to server) "; + case QueryType_CCL2RPN: return "CCL -> RPN (RPN sent to server)"; + case QueryType_CQL: return "CQL (CQL sent to server)"; + default: + return "unknown Query type internal yaz-client error"; + } +} void do_hex_dump(char* buf,int len) { #if 0 - int i,x; - for( i=0; i= 32) || strchr ("\n\r\t\f", buf[i])) - printf ("%c", buf[i]); - else - printf ("\\X%02X", buf[i]); + size_t i; + for (i = 0; i= 32) || strchr ("\n\r\t\f", buf[i])) + printf ("%c", buf[i]); + else + printf ("\\X%02X", buf[i]); } static void print_refid (Z_ReferenceId *id) @@ -357,16 +374,16 @@ static int process_initResponse(Z_InitResponse *res) yaz_get_charneg_record(res->otherInfo); if (p) { - - char *charset=NULL, *lang=NULL; - int selected; - - yaz_get_response_charneg(session_mem, p, &charset, &lang, + + char *charset=NULL, *lang=NULL; + int selected; + + yaz_get_response_charneg(session_mem, p, &charset, &lang, &selected); - - printf("Accepted character set : %s\n", charset); - printf("Accepted code language : %s\n", lang ? lang : "none"); - printf("Accepted records in ...: %d\n", selected ); + + printf("Accepted character set : %s\n", charset); + printf("Accepted code language : %s\n", lang ? lang : "none"); + printf("Accepted records in ...: %d\n", selected ); } } fflush (stdout); @@ -415,8 +432,8 @@ void cmd_open_remember_last_open_command(char* arg, char* new_open_command) { if(last_open_command) xfree(last_open_command); last_open_command = xstrdup(new_open_command); - }; -}; + } +} int cmd_open(char *arg) { @@ -465,7 +482,11 @@ int cmd_open(char *arg) { printf ("error = %s\n", cs_strerror(conn)); if (conn->cerrno == CSYSERR) - perror("system"); + { + char msg[256]; + yaz_strerror(msg, sizeof(msg)); + printf ("%s\n", msg); + } cs_close(conn); conn = 0; return 0; @@ -495,7 +516,7 @@ void try_reconnect() process_cmd_line(open_command); xfree(open_command); -}; +} int cmd_authentication(char *arg) { @@ -546,105 +567,6 @@ int cmd_authentication(char *arg) /* SEARCH SERVICE ------------------------------ */ static void display_record(Z_External *r); -static void display_variant(Z_Variant *v, int level) -{ - int i; - - for (i = 0; i < v->num_triples; i++) - { - printf("%*sclass=%d,type=%d", level * 4, "", *v->triples[i]->zclass, - *v->triples[i]->type); - if (v->triples[i]->which == Z_Triple_internationalString) - printf(",value=%s\n", v->triples[i]->value.internationalString); - else - printf("\n"); - } -} - -static void display_grs1(Z_GenericRecord *r, int level) -{ - int i; - - if (!r) - { - return; - } - for (i = 0; i < r->num_elements; i++) - { - Z_TaggedElement *t; - - printf("%*s", level * 4, ""); - t = r->elements[i]; - printf("("); - if (t->tagType) - printf("%d,", *t->tagType); - else - printf("?,"); - if (t->tagValue->which == Z_StringOrNumeric_numeric) - printf("%d) ", *t->tagValue->u.numeric); - else - printf("%s) ", t->tagValue->u.string); - if (t->content->which == Z_ElementData_subtree) - { - if (!t->content->u.subtree) - printf (" (no subtree)\n"); - else - { - printf("\n"); - display_grs1(t->content->u.subtree, level+1); - } - } - else if (t->content->which == Z_ElementData_string) - printf("%s\n", t->content->u.string); - else if (t->content->which == Z_ElementData_numeric) - printf("%d\n", *t->content->u.numeric); - else if (t->content->which == Z_ElementData_oid) - { - int *ip = t->content->u.oid; - oident *oent; - - if ((oent = oid_getentbyoid(t->content->u.oid))) - printf("OID: %s\n", oent->desc); - else - { - printf("{"); - while (ip && *ip >= 0) - printf(" %d", *(ip++)); - printf(" }\n"); - } - } - else if (t->content->which == Z_ElementData_noDataRequested) - printf("[No data requested]\n"); - else if (t->content->which == Z_ElementData_elementEmpty) - printf("[Element empty]\n"); - else if (t->content->which == Z_ElementData_elementNotThere) - printf("[Element not there]\n"); - else if (t->content->which == Z_ElementData_date) - printf("Date: %s\n", t->content->u.date); - else if (t->content->which == Z_ElementData_ext) - { - printf ("External\n"); - display_record (t->content->u.ext); - } - else - printf("? type = %d\n",t->content->which); - if (t->appliedVariant) - display_variant(t->appliedVariant, level+1); - if (t->metaData && t->metaData->supportedVariants) - { - int c; - - printf("%*s---- variant list\n", (level+1)*4, ""); - for (c = 0; c < t->metaData->num_supportedVariants; c++) - { - printf("%*svariant #%d\n", (level+1)*4, "", c); - display_variant(t->metaData->supportedVariants[c], level + 2); - } - } - } -} - - static void print_record(const unsigned char *buf, size_t len) { size_t i = len; @@ -691,18 +613,19 @@ static void display_record(Z_External *r) odr_perror(in, "Decoding constructed record."); fprintf(stderr, "[Near %d]\n", odr_offset(in)); fprintf(stderr, "Packet dump:\n---------\n"); - odr_dumpBER(stderr, (char*)r->u.octet_aligned->buf,r->u.octet_aligned->len); + odr_dumpBER(stderr, (char*)r->u.octet_aligned->buf, + r->u.octet_aligned->len); fprintf(stderr, "---------\n"); - - /* note just ignores the error ant print the bytes form the octet_aligned laiter */ + + /* note just ignores the error ant print the bytes form the octet_aligned later */ } else { - /* - * Note: we throw away the original, BER-encoded record here. - * Do something else with it if you want to keep it. - */ - r->u.sutrs = (Z_SUTRS *) rr; /* we don't actually check the type here. */ - r->which = type->what; - }; + /* + * Note: we throw away the original, BER-encoded record here. + * Do something else with it if you want to keep it. + */ + r->u.sutrs = (Z_SUTRS *) rr; /* we don't actually check the type here. */ + r->which = type->what; + } } } if (ent && ent->oclass != CLASS_RECSYN) @@ -710,7 +633,7 @@ static void display_record(Z_External *r) if (ent && ent->value == VAL_SOIF) print_record((const unsigned char *) r->u.octet_aligned->buf, r->u.octet_aligned->len); - else if (r->which == Z_External_octet && r->u.octet_aligned->len) + else if (r->which == Z_External_octet) { const char *octet_buf = (char*)r->u.octet_aligned->buf; if (ent->value == VAL_TEXT_XML || ent->value == VAL_APPLICATION_XML || @@ -738,13 +661,64 @@ static void display_record(Z_External *r) #endif ) { - if (marc_display_exl (octet_buf, NULL, 0 /* debug */, - r->u.octet_aligned->len) <= 0) + char *result; + int rlen; + yaz_iconv_t cd = 0; + yaz_marc_t mt = yaz_marc_create(); + + if (yaz_marc_decode_buf(mt, octet_buf,r->u.octet_aligned->len, + &result, &rlen)> 0) + { + char *from = 0; + if (ent->value == VAL_USMARC) + { + if (octet_buf[9] == 'a') + from = "UTF-8"; + else + from = "MARC8"; + } + else + from = "ISO-8859-1"; + + if (codeset && from) + { + printf ("convert from %s to %s\n", from, codeset); + cd = yaz_iconv_open(codeset, from); + } + if (!cd) + fwrite (result, 1, rlen, stdout); + else + { + char outbuf[12]; + size_t inbytesleft = rlen; + const char *inp = result; + + while (inbytesleft) + { + size_t outbytesleft = sizeof(outbuf); + char *outp = outbuf; + size_t r = yaz_iconv (cd, (char**) &inp, + &inbytesleft, + &outp, &outbytesleft); + if (r == (size_t) (-1)) + { + int e = yaz_iconv_error(cd); + if (e != YAZ_ICONV_E2BIG) + break; + } + fwrite (outbuf, outp - outbuf, 1, stdout); + } + } + } + else { printf ("bad MARC. Dumping as it is:\n"); print_record((const unsigned char*) octet_buf, - r->u.octet_aligned->len); - } + r->u.octet_aligned->len); + } + yaz_marc_destroy(mt); + if (cd) + yaz_iconv_close(cd); } else { @@ -766,12 +740,16 @@ static void display_record(Z_External *r) } else if (ent && ent->value == VAL_GRS1) { + WRBUF w; if (r->which != Z_External_grs1) { printf("Expecting single GRS type for GRS.\n"); return; } - display_grs1(r->u.grs1, 0); + w = wrbuf_alloc(); + yaz_display_grs1(w, r->u.grs1, 0); + puts (wrbuf_buf(w)); + wrbuf_free(w, 1); } else { @@ -899,6 +877,7 @@ static int send_searchRequest(char *arg) Z_RPNQuery *RPNquery; Odr_oct ccl_query; YAZ_PQF_Parser pqf_parser; + Z_External *ext; if (queryType == QueryType_CCL2RPN) { @@ -985,6 +964,16 @@ static int send_searchRequest(char *arg) query.u.type_1 = RPNquery; ccl_rpn_delete (rpn); break; + case QueryType_CQL: + query.which = Z_Query_type_104; + ext = odr_malloc(out, sizeof(*ext)); + ext->direct_reference = odr_getoidbystr(out, "1.2.840.10003.16.2"); + ext->indirect_reference = 0; + ext->descriptor = 0; + ext->which = Z_External_CQL; + ext->u.cql = odr_strdup(out, arg); + query.u.type_104 = ext; + break; default: printf ("Unsupported query type\n"); return 0; @@ -1156,7 +1145,9 @@ static void print_string_or_numeric(int iLevel, const char *pTag, Z_StringOrNume } } -static void print_universe_report_duplicate(int iLevel, Z_UniverseReportDuplicate *pUniverseReportDuplicate) +static void print_universe_report_duplicate( + int iLevel, + Z_UniverseReportDuplicate *pUniverseReportDuplicate) { if (pUniverseReportDuplicate != NULL) { @@ -1168,9 +1159,9 @@ static void print_universe_report_duplicate(int iLevel, Z_UniverseReportDuplicat } } -static void -print_universe_report_hits(int iLevel, - Z_UniverseReportHits *pUniverseReportHits) +static void print_universe_report_hits( + int iLevel, + Z_UniverseReportHits *pUniverseReportHits) { if (pUniverseReportHits != NULL) { @@ -1194,11 +1185,13 @@ static void print_universe_report(int iLevel, Z_UniverseReport *pUniverseReport) switch (pUniverseReport->which) { case Z_UniverseReport_databaseHits: - print_universe_report_hits(iLevel, pUniverseReport->u.databaseHits); + print_universe_report_hits(iLevel, + pUniverseReport->u.databaseHits); break; case Z_UniverseReport_duplicate: - print_universe_report_duplicate(iLevel, pUniverseReport->u.duplicate); + print_universe_report_duplicate(iLevel, + pUniverseReport->u.duplicate); break; default: @@ -1531,11 +1524,64 @@ static int cmd_update(char *arg) Z_IUOriginPartToKeep *toKeep; Z_IUSuppliedRecords *notToKeep; oident update_oid; - printf ("Update request\n"); - fflush(stdout); - - if (!record_last) + char action[20], recid[20], fname[80]; + int action_no; + Z_External *record_this = 0; + + *action = 0; + *recid = 0; + *fname = 0; + sscanf (arg, "%19s %19s %79s", action, recid, fname); + + if (!strcmp (action, "insert")) + action_no = Z_IUOriginPartToKeep_recordInsert; + else if (!strcmp (action, "replace")) + action_no = Z_IUOriginPartToKeep_recordReplace; + else if (!strcmp (action, "delete")) + action_no = Z_IUOriginPartToKeep_recordDelete; + else if (!strcmp (action, "update")) + action_no = Z_IUOriginPartToKeep_specialUpdate; + else + { + printf ("Bad action: %s\n", action); + printf ("Possible values: insert, replace, delete, update\n"); return 0; + } + + if (*fname) + { + FILE *inf; + struct stat status; + stat (fname, &status); + if (S_ISREG(status.st_mode) && (inf = fopen(fname, "r"))) + { + size_t len = status.st_size; + char *buf = (char *) xmalloc (len); + + fread (buf, 1, len, inf); + + fclose (inf); + + record_this = z_ext_record (out, VAL_TEXT_XML, buf, len); + + xfree (buf); + } + else + { + printf ("File %s doesn't exist\n", fname); + return 0; + } + } + else + { + if (!record_last) + { + printf ("No last record (update ignored)\n"); + return 0; + } + record_this = record_last; + } + update_oid.proto = PROTO_Z3950; update_oid.oclass = CLASS_EXTSERV; update_oid.value = VAL_DBUPDATE; @@ -1562,7 +1608,7 @@ static int cmd_update(char *arg) toKeep->elementSetName = 0; toKeep->actionQualifier = 0; toKeep->action = (int *) odr_malloc(out, sizeof(*toKeep->action)); - *toKeep->action = Z_IUOriginPartToKeep_recordInsert; + *toKeep->action = action_no; notToKeep = r->u.update->u.esRequest->notToKeep = (Z_IUSuppliedRecords *) odr_malloc(out, sizeof(*r->u.update->u.esRequest->notToKeep)); @@ -1571,10 +1617,20 @@ static int cmd_update(char *arg) odr_malloc(out, sizeof(*notToKeep->elements)); notToKeep->elements[0] = (Z_IUSuppliedRecords_elem *) odr_malloc(out, sizeof(**notToKeep->elements)); - notToKeep->elements[0]->u.number = 0; + notToKeep->elements[0]->which = Z_IUSuppliedRecords_elem_opaque; + if (*recid) + { + notToKeep->elements[0]->u.opaque = (Odr_oct *) + odr_malloc (out, sizeof(Odr_oct)); + notToKeep->elements[0]->u.opaque->buf = (unsigned char *) recid; + notToKeep->elements[0]->u.opaque->size = strlen(recid); + notToKeep->elements[0]->u.opaque->len = strlen(recid); + } + else + notToKeep->elements[0]->u.opaque = 0; notToKeep->elements[0]->supplementalId = 0; notToKeep->elements[0]->correlationInfo = 0; - notToKeep->elements[0]->record = record_last; + notToKeep->elements[0]->record = record_this; send_apdu(apdu); @@ -2125,17 +2181,19 @@ int cmd_schema(char *arg) int cmd_format(char *arg) { + oid_value nsyntax; if (!arg || !*arg) { printf("Usage: format \n"); return 0; } - recordsyntax = oid_getvalbyname (arg); - if (recordsyntax == VAL_NONE) + nsyntax = oid_getvalbyname (arg); + if (strcmp(arg, "none") && nsyntax == VAL_NONE) { printf ("unknown record syntax\n"); return 0; } + recordsyntax = nsyntax; return 1; } @@ -2182,12 +2240,15 @@ int cmd_querytype (char *arg) queryType = QueryType_Prefix; else if (!strcmp (arg, "ccl2rpn") || !strcmp (arg, "cclrpn")) queryType = QueryType_CCL2RPN; + else if (!strcmp(arg, "cql")) + queryType = QueryType_CQL; else { printf ("Querytype must be one of:\n"); printf (" prefix - Prefix query\n"); printf (" ccl - CCL query\n"); printf (" ccl2rpn - CCL query converted to RPN\n"); + printf (" cql - CQL\n"); return 0; } return 1; @@ -2386,32 +2447,31 @@ int cmd_set_cclfile(char* arg) ccl_qual_file (bibset, inf); fclose (inf); } - - strcpy(ccl_fields,arg); + strcpy(ccl_fields,arg); return 0; } int cmd_set_auto_reconnect(char* arg) { - REMOVE_TAILING_BLANKS(arg); - - if(strlen(arg)==0) { - auto_reconnect = ! auto_reconnect; - } else if(strcmp(arg,"on")==0) { - auto_reconnect = 1; - } else if(strcmp(arg,"off")==0) { - auto_reconnect = 0; - } else { - printf("Error use on or off\n"); - return 1; - }; - + REMOVE_TAILING_BLANKS(arg); + + if(strlen(arg)==0) { + auto_reconnect = ! auto_reconnect; + } else if(strcmp(arg,"on")==0) { + auto_reconnect = 1; + } else if(strcmp(arg,"off")==0) { + auto_reconnect = 0; + } else { + printf("Error use on or off\n"); + return 1; + } + if (auto_reconnect) printf("Set auto reconnect enabled.\n"); else printf("Set auto reconnect disabled.\n"); - + return 0; } @@ -2425,23 +2485,24 @@ int cmd_set_marcdump(char* arg) if(strlen(arg)<1) { return 1; } - + if(!strcmp(arg,"-")) marcdump=stderr; else marcdump=fopen(arg, "a"); - + if(!marcdump) { perror("unable to open apdu marcdump file no marcdump done\n"); } - + return 1; } -int cmd_set_proxy(char* arg) { +int cmd_set_proxy(char* arg) +{ if(yazProxy) free(yazProxy); yazProxy=NULL; - + if(strlen(arg) > 1) { yazProxy=strdup(arg); } @@ -2450,7 +2511,7 @@ int cmd_set_proxy(char* arg) { /* this command takes 3 arge {name class oid} - */ +*/ int cmd_register_oid(char* args) { static struct { char* className; @@ -2471,7 +2532,7 @@ int cmd_register_oid(char* args) { {"schema",CLASS_SCHEMA}, {"tagset",CLASS_TAGSET}, {"general",CLASS_GENERAL}, - {0,0} + {0,(enum oid_class) 0} }; char oname_str[101], oclass_str[101], oid_str[101]; char* name; @@ -2498,7 +2559,7 @@ int cmd_register_oid(char* args) { printf("Unknonwn oid class %s\n",oclass_str); return 0; } - + i = 0; name = oid_str; val = 0; @@ -2543,7 +2604,7 @@ void source_rcfile() struct stat statbuf; char buffer[1000]; char* homedir=getenv("HOME"); - + if(!homedir) return; sprintf(buffer,"%s/.yazclientrc",homedir); @@ -2561,8 +2622,8 @@ void source_rcfile() static void initialize(void) { FILE *inf; - int i; - + int i; + if (!(out = odr_createmem(ODR_ENCODE)) || !(in = odr_createmem(ODR_DECODE)) || !(print = odr_createmem(ODR_PRINT))) @@ -2571,7 +2632,7 @@ static void initialize(void) exit(1); } oid_init(); - + setvbuf(stdout, 0, _IONBF, 0); if (apdu_file) odr_setprint(print, apdu_file); @@ -2588,13 +2649,13 @@ static void initialize(void) #if HAVE_READLINE_READLINE_H rl_attempted_completion_function = (CPPFunction*)readline_completer; #endif - - - for(i=0; i=maxOtherInfosSupported) { - printf("Error otherinfo index to large (%d>%d)\n",otherinfoNo,maxOtherInfosSupported); - }; - extraOtherInfos[otherinfoNo].oidval = -1; - if(extraOtherInfos[otherinfoNo].value) free(extraOtherInfos[otherinfoNo].value); - return 0; - }; - if (sscan_res<3) { + char oid[101], otherinfoString[101]; + int otherinfoNo; + int sscan_res; + int oidval; + + sscan_res = sscanf (args, "%d %100[^ ] %100s", &otherinfoNo, oid, otherinfoString); + if(sscan_res==1) { + /* reset this otherinfo */ + if(otherinfoNo>=maxOtherInfosSupported) { + printf("Error otherinfo index to large (%d>%d)\n",otherinfoNo,maxOtherInfosSupported); + } + extraOtherInfos[otherinfoNo].oidval = -1; + if(extraOtherInfos[otherinfoNo].value) free(extraOtherInfos[otherinfoNo].value); + return 0; + } + if (sscan_res<3) { printf("Error in set_otherinfo command \n"); return 0; } - - if(otherinfoNo>=maxOtherInfosSupported) { - printf("Error otherinfo index to large (%d>%d)\n",otherinfoNo,maxOtherInfosSupported); - }; - - - oidval = oid_getvalbyname (oid); - if(oidval == -1 ) { + + if(otherinfoNo>=maxOtherInfosSupported) { + printf("Error otherinfo index to large (%d>%d)\n",otherinfoNo,maxOtherInfosSupported); + } + + + oidval = oid_getvalbyname (oid); + if(oidval == -1 ) { printf("Error in set_otherinfo command unknown oid %s \n",oid); - return 0; - }; - extraOtherInfos[otherinfoNo].oidval = oidval; - if(extraOtherInfos[otherinfoNo].value) free(extraOtherInfos[otherinfoNo].value); - extraOtherInfos[otherinfoNo].value = strdup(otherinfoString); - - return 0; -}; + return 0; + } + extraOtherInfos[otherinfoNo].oidval = oidval; + if(extraOtherInfos[otherinfoNo].value) free(extraOtherInfos[otherinfoNo].value); + extraOtherInfos[otherinfoNo].value = strdup(otherinfoString); + + return 0; +} int cmd_list_otherinfo(char* args) { - int i; - - if(strlen(args)>0) { - i = atoi(args); - if( i >= maxOtherInfosSupported ) { - printf("Error otherinfo index to large (%d>%d)\n",i,maxOtherInfosSupported); - return 0; - }; + int i; + + if(strlen(args)>0) { + i = atoi(args); + if( i >= maxOtherInfosSupported ) { + printf("Error otherinfo index to large (%d>%d)\n",i,maxOtherInfosSupported); + return 0; + } - if(extraOtherInfos[i].oidval != -1) - printf(" otherinfo %d %s %s\n",i,yaz_z3950_oid_value_to_str(extraOtherInfos[i].oidval,CLASS_RECSYN), extraOtherInfos[i].value); - - } else { - for(i=0; iwhich) { - case Z_IdAuthentication_idPass: - printf("Authentication : IdPass\n"); - printf(" Login User : %s\n",auth->u.idPass->userId?auth->u.idPass->userId:""); - printf(" Login Group : %s\n",auth->u.idPass->groupId?auth->u.idPass->groupId:""); - printf(" Password : %s\n",auth->u.idPass->password?auth->u.idPass->password:""); - break; - case Z_IdAuthentication_open: - printf("Authentication : psOpen\n"); - printf(" Open string : %s\n",auth->u.open); - break; - default: - printf("Authentication : Unknown\n"); - }; - }; - if ( yazCharset ) printf("Character set : `%s'\n", (yazCharset) ? yazCharset:NULL); - - /* bases */ - printf("Bases : "); + 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); + + printf("auto_reconnect : %s\n",auto_reconnect?"on":"off"); + + if (!auth) { + printf("Authentication : none\n"); + } else { + switch(auth->which) { + case Z_IdAuthentication_idPass: + printf("Authentication : IdPass\n"); + printf(" Login User : %s\n",auth->u.idPass->userId?auth->u.idPass->userId:""); + printf(" Login Group : %s\n",auth->u.idPass->groupId?auth->u.idPass->groupId:""); + printf(" Password : %s\n",auth->u.idPass->password?auth->u.idPass->password:""); + break; + case Z_IdAuthentication_open: + printf("Authentication : psOpen\n"); + printf(" Open string : %s\n",auth->u.open); + break; + default: + printf("Authentication : Unknown\n"); + } + } + if ( yazCharset ) printf("Character set : `%s'\n", (yazCharset) ? yazCharset:NULL); + + /* bases */ + printf("Bases : "); for (i = 0; iu.generic:""); - - /* loging options */ - printf("APDU log : %s\n",apdu_file?"on":"off"); - printf("Record log : %s\n",marcdump?"on":"off"); - - /* other infos */ - printf("Other Info: \n"); - cmd_list_otherinfo(""); - - return 0; -}; + printf("\n"); + + /* Query options */ + printf("CCL file : %s\n",ccl_fields); + printf("Query type : %s\n",query_type_as_string(queryType)); + + printf("Named Result Sets : %s\n",setnumber==-1?"off":"on"); + + /* piggy back options */ + printf("ssub/lslb/mspn : %d/%d/%d\n",smallSetUpperBound,largeSetLowerBound,mediumSetPresentNumber); + + /* print present related options */ + printf("Format : %s\n",yaz_z3950_oid_value_to_str(recordsyntax,CLASS_RECSYN)); + printf("Schema : %s\n",yaz_z3950_oid_value_to_str(schema,CLASS_SCHEMA)); + printf("Elements : %s\n",elementSetNames?elementSetNames->u.generic:""); + + /* loging options */ + printf("APDU log : %s\n",apdu_file?"on":"off"); + printf("Record log : %s\n",marcdump?"on":"off"); + + /* other infos */ + printf("Other Info: \n"); + cmd_list_otherinfo(""); + + return 0; +} int cmd_clear_otherinfo(char* args) { - if(strlen(args)>0) { - int otherinfoNo; - otherinfoNo = atoi(args); - if( otherinfoNo >= maxOtherInfosSupported ) { - printf("Error otherinfo index to large (%d>%d)\n",otherinfoNo,maxOtherInfosSupported); - return 0; - }; - - if(extraOtherInfos[otherinfoNo].oidval != -1) { - /* only clear if set. */ - extraOtherInfos[otherinfoNo].oidval=-1; - free(extraOtherInfos[otherinfoNo].value); - }; - } else { - int i; + if(strlen(args)>0) { + int otherinfoNo; + otherinfoNo = atoi(args); + if( otherinfoNo >= maxOtherInfosSupported ) { + printf("Error otherinfo index to large (%d>%d)\n",otherinfoNo,maxOtherInfosSupported); + return 0; + } + + if(extraOtherInfos[otherinfoNo].oidval != -1) { + /* only clear if set. */ + extraOtherInfos[otherinfoNo].oidval=-1; + free(extraOtherInfos[otherinfoNo].value); + } + } else { + int i; - for(i=0; i[':'][/]",NULL,0,NULL}, {"quit", cmd_quit, "",NULL,0,NULL}, @@ -2937,7 +3008,7 @@ static struct { {"querytype", cmd_querytype, "",complete_querytype,0,NULL}, {"refid", cmd_refid, "",NULL,0,NULL}, {"itemorder", cmd_itemorder, "ill|item ",NULL,0,NULL}, - {"update", cmd_update, "",NULL,0,NULL}, + {"update", cmd_update, " []",NULL,0,NULL}, {"packagename", cmd_packagename, "",NULL,0,NULL}, {"proxy", cmd_proxy, "[('tcp'|'ssl')][':']",NULL,0,NULL}, {"charset", cmd_charset, "",NULL,0,NULL}, @@ -3012,44 +3083,43 @@ static int cmd_help (char *line) int cmd_register_tab(char* arg) { - char command[101], tabargument[101]; - int i; - int num_of_tabs; - char** tabslist; - - if (sscanf (arg, "%100s %100s", command, tabargument) < 1) { - return 0; - }; - - /* locate the amdn in the list */ - for (i = 0; cmd[i].cmd; i++) { - if (!strncmp(cmd[i].cmd, command, strlen(command))) { - break; - } - } - - if(!cmd[i].cmd) { - fprintf(stderr,"Unknown command %s\n",command); - return 1; - }; - - - - if(!cmd[i].local_tabcompletes) { - cmd[i].local_tabcompletes = calloc(1,sizeof(char**)); - }; - - num_of_tabs=0; - - tabslist = cmd[i].local_tabcompletes; - for(;tabslist && *tabslist;tabslist++) { - num_of_tabs++; - }; - - cmd[i].local_tabcompletes=realloc(cmd[i].local_tabcompletes,(num_of_tabs+2)*sizeof(char**)); - tabslist=cmd[i].local_tabcompletes; - tabslist[num_of_tabs]=strdup(tabargument); - tabslist[num_of_tabs+1]=NULL; + char command[101], tabargument[101]; + int i; + int num_of_tabs; + char** tabslist; + + if (sscanf (arg, "%100s %100s", command, tabargument) < 1) { + return 0; + } + + /* locate the amdn in the list */ + for (i = 0; cmd[i].cmd; i++) { + if (!strncmp(cmd[i].cmd, command, strlen(command))) { + break; + } + } + + if(!cmd[i].cmd) { + fprintf(stderr,"Unknown command %s\n",command); + return 1; + } + + + if(!cmd[i].local_tabcompletes) + cmd[i].local_tabcompletes = (char **) calloc(1,sizeof(char**)); + + num_of_tabs=0; + + tabslist = cmd[i].local_tabcompletes; + for(;tabslist && *tabslist;tabslist++) { + num_of_tabs++; + } + + cmd[i].local_tabcompletes = (char **) + realloc(cmd[i].local_tabcompletes,(num_of_tabs+2)*sizeof(char**)); + tabslist=cmd[i].local_tabcompletes; + tabslist[num_of_tabs]=strdup(tabargument); + tabslist[num_of_tabs+1]=NULL; return 1; } @@ -3087,14 +3157,14 @@ void process_cmd_line(char* line) *(++lastnonspace) = 0; } - + for (i = 0; cmd[i].cmd; i++) if (!strncmp(cmd[i].cmd, word, strlen(word))) { res = (*cmd[i].fun)(arg); break; } - + if (!cmd[i].cmd) /* dump our help-screen */ { printf("Unknown command: %s.\n", word); @@ -3102,12 +3172,12 @@ void process_cmd_line(char* line) /* cmd_help (""); */ res = 1; } - + if(apdu_file) fflush(apdu_file); if (res >= 2) wait_and_handle_responce(); - + if(apdu_file) fflush(apdu_file); if(marcdump) @@ -3156,38 +3226,38 @@ char ** readline_completer(char *text, int start, int end) { rl_attempted_completion_over = 1; return NULL; } - + for (i = 0; cmd[i].cmd; i++) { if (!strncmp(cmd[i].cmd, word, strlen(word))) { break; } } - - if(!cmd[i].cmd) return NULL; - - - curret_global_list = cmd[i].local_tabcompletes; - - completerToUse = cmd[i].rl_completerfunction; - if(completerToUse==NULL) /* if no pr. command completer is defined use the default completer */ - completerToUse = default_completer; - + + if(!cmd[i].cmd) return NULL; + + + curret_global_list = cmd[i].local_tabcompletes; + + completerToUse = cmd[i].rl_completerfunction; + if(completerToUse==NULL) /* if no pr. command completer is defined use the default completer */ + completerToUse = default_completer; + if(completerToUse) { #ifdef HAVE_READLINE_RL_COMPLETION_MATCHES char** res= rl_completion_matches(text, - completerToUse); + completerToUse); #else char** res= completion_matches(text, (CPFunction*)completerToUse); #endif - if(!cmd[i].complete_filenames) - rl_attempted_completion_over = 1; - return res; + if(!cmd[i].complete_filenames) + rl_attempted_completion_over = 1; + return res; } else { - if(!cmd[i].complete_filenames) - rl_attempted_completion_over = 1; + if(!cmd[i].complete_filenames) + rl_attempted_completion_over = 1; return 0; } } @@ -3246,7 +3316,15 @@ int main(int argc, char **argv) char *arg; int ret; - while ((ret = options("k:c:a:m:v:p:u:", argv, argc, &arg)) != -2) +#if HAVE_LOCALE_H + if (!setlocale(LC_CTYPE, "")) + fprintf (stderr, "setlocale failed\n"); +#endif +#if HAVE_LANGINFO_H + codeset = nl_langinfo(CODESET); +#endif + + while ((ret = options("k:c:a:m:v:p:u:t:", argv, argc, &arg)) != -2) { switch (ret) { @@ -3268,19 +3346,22 @@ int main(int argc, char **argv) exit (1); } break; - case 'c': - strncpy (ccl_fields, arg, sizeof(ccl_fields)-1); - ccl_fields[sizeof(ccl_fields)-1] = '\0'; - break; + case 't': + codeset = arg; + break; + case 'c': + strncpy (ccl_fields, arg, sizeof(ccl_fields)-1); + ccl_fields[sizeof(ccl_fields)-1] = '\0'; + break; case 'a': if (!strcmp(arg, "-")) apdu_file=stderr; else apdu_file=fopen(arg, "a"); break; - case 'p': - yazProxy=strdup(arg); - break; + case 'p': + yazProxy=strdup(arg); + break; case 'u': if (!auth_command) { @@ -3327,10 +3408,11 @@ int main(int argc, char **argv) exit (0); } - /* * Local variables: - * tab-width: 4 + * tab-width: 8 * c-basic-offset: 4 * End: + * vim600: sw=4 ts=8 fdm=marker + * vim<600: sw=4 ts=8 */