-/*
- * 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 <stdio.h>
#include <stdlib.h>
+#if HAVE_LOCALE_H
+#include <locale.h>
+#endif
+
+#if HAVE_LANGINFO_H
+#include <langinfo.h>
+#endif
+
#include <time.h>
+#include <ctype.h>
+
+#ifdef WIN32
+#include <io.h>
+#define S_ISREG(x) (x & _S_IFREG)
+#define S_ISDIR(x) (x & _S_IFDIR)
+#endif
#include <yaz/yaz-util.h>
#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 */
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;
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";
typedef enum {
QueryType_Prefix,
QueryType_CCL,
- QueryType_CCL2RPN
+ QueryType_CCL2RPN,
+ QueryType_CQL
} QueryType;
static QueryType queryType = QueryType_Prefix;
#define maxOtherInfosSupported 10
struct {
int oidval;
- char* value;
+ char* value;
} extraOtherInfos[maxOtherInfosSupported];
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<len ; i=i+16 )
+ int i,x;
+ for( i=0; i<len ; i=i+16 )
{
- printf(" %4.4d ",i);
- for(x=0 ; i+x<len && x<16; ++x)
+ printf(" %4.4d ",i);
+ for(x=0 ; i+x<len && x<16; ++x)
{
- printf("%2.2X ",(unsigned int)((unsigned char)buf[i+x]));
- };
- printf("\n");
- };
+ printf("%2.2X ",(unsigned int)((unsigned char)buf[i+x]));
+ }
+ printf("\n");
+ }
#endif
-};
-
-
+}
void add_otherInfos(Z_APDU *a)
{
- Z_OtherInformation **oi;
- int i;
+ Z_OtherInformation **oi;
+ int i;
- yaz_oi_APDU(a, &oi);
- for(i=0; i<maxOtherInfosSupported; ++i)
+ yaz_oi_APDU(a, &oi);
+ for(i=0; i<maxOtherInfosSupported; ++i)
{
- if(extraOtherInfos[i].oidval != -1)
- yaz_oi_set_string_oidval(oi, out, extraOtherInfos[i].oidval, 1, extraOtherInfos[i].value);
- };
-};
+ if(extraOtherInfos[i].oidval != -1)
+ yaz_oi_set_string_oidval(oi, out, extraOtherInfos[i].oidval, 1, extraOtherInfos[i].value);
+ }
+}
void send_apdu(Z_APDU *a)
{
- char *buf;
+ char *buf;
int len;
-
- add_otherInfos(a);
-
+
+ add_otherInfos(a);
+
if (apdu_file)
{
z_APDU(print, &a, 0, 0);
fprintf(stderr, "cs_put: %s", cs_errmsg(cs_errno(conn)));
exit(1);
}
-
- do_hex_dump(buf,len);
+
+ do_hex_dump(buf,len);
odr_reset(out); /* release the APDU structure */
}
static void print_stringn(const unsigned char *buf, size_t len)
{
- size_t i;
- for (i = 0; i<len; i++)
- if ((buf[i] <= 126 && buf[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<len; i++)
+ if ((buf[i] <= 126 && buf[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)
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);
{
if(last_open_command) xfree(last_open_command);
last_open_command = xstrdup(new_open_command);
- };
-};
+ }
+}
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;
process_cmd_line(open_command);
xfree(open_command);
-};
+}
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;
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)
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 ||
#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
{
}
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
{
Z_RPNQuery *RPNquery;
Odr_oct ccl_query;
YAZ_PQF_Parser pqf_parser;
+ Z_External *ext;
if (queryType == QueryType_CCL2RPN)
{
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;
}
}
-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)
{
}
}
-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)
{
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:
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;
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));
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);
int cmd_format(char *arg)
{
+ oid_value nsyntax;
if (!arg || !*arg)
{
printf("Usage: format <recordsyntax>\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;
}
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;
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;
}
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);
}
/*
this command takes 3 arge {name class oid}
- */
+*/
int cmd_register_oid(char* args) {
static struct {
char* className;
{"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;
printf("Unknonwn oid class %s\n",oclass_str);
return 0;
}
-
+
i = 0;
name = oid_str;
val = 0;
struct stat statbuf;
char buffer[1000];
char* homedir=getenv("HOME");
-
+
if(!homedir) return;
sprintf(buffer,"%s/.yazclientrc",homedir);
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)))
exit(1);
}
oid_init();
-
+
setvbuf(stdout, 0, _IONBF, 0);
if (apdu_file)
odr_setprint(print, apdu_file);
#if HAVE_READLINE_READLINE_H
rl_attempted_completion_function = (CPPFunction*)readline_completer;
#endif
-
-
- for(i=0; i<maxOtherInfosSupported; ++i) {
- extraOtherInfos[i].oidval = -1;
- };
-
- source_rcfile();
+
+
+ for(i=0; i<maxOtherInfosSupported; ++i) {
+ extraOtherInfos[i].oidval = -1;
+ }
+
+ source_rcfile();
}
int cmd_cclparse(char* arg)
{
int error, pos;
- struct ccl_rpn_node *rpn=NULL;
-
-
- rpn = ccl_find_str (bibset, arg, &error, &pos);
-
- if (error) {
- printf ("%*s^ - ", 3+strlen(last_cmd)+1+pos, " ");
- printf ("%s\n", ccl_err_msg (error));
- }
- else
- {
- if (rpn)
- {
- ccl_pr_tree(rpn, stdout);
- }
- }
- if (rpn)
- ccl_rpn_delete(rpn);
-
+ struct ccl_rpn_node *rpn=NULL;
+
+
+ rpn = ccl_find_str (bibset, arg, &error, &pos);
+
+ if (error) {
+ printf ("%*s^ - ", 3+strlen(last_cmd)+1+pos, " ");
+ printf ("%s\n", ccl_err_msg (error));
+ }
+ else
+ {
+ if (rpn)
+ {
+ ccl_pr_tree(rpn, stdout);
+ }
+ }
+ if (rpn)
+ ccl_rpn_delete(rpn);
+
printf ("\n");
-
- return 0;
-};
+
+ return 0;
+}
int cmd_set_otherinfo(char* args)
{
- 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) {
+ 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; i<maxOtherInfosSupported; ++i) {
- 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);
- };
-
- }
- return 0;
-};
+ if(extraOtherInfos[i].oidval != -1)
+ printf(" otherinfo %d %s %s\n",
+ i,
+ yaz_z3950_oid_value_to_str(
+ (enum oid_value) extraOtherInfos[i].oidval,
+ CLASS_RECSYN),
+ extraOtherInfos[i].value);
+
+ } else {
+ for(i=0; i<maxOtherInfosSupported; ++i) {
+ if(extraOtherInfos[i].oidval != -1)
+ printf(" otherinfo %d %s %s\n",
+ i,
+ yaz_z3950_oid_value_to_str(
+ (enum oid_value) extraOtherInfos[i].oidval,
+ CLASS_RECSYN),
+ extraOtherInfos[i].value);
+ }
+
+ }
+ return 0;
+}
int cmd_list_all(char* args) {
- 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 : ");
+ 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; i<num_databaseNames; i++) printf("%s ",databaseNames[i]);
- 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;
-};
+ 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<maxOtherInfosSupported; ++i) {
- if (extraOtherInfos[i].oidval!=-1 ) {
- extraOtherInfos[i].oidval=-1;
- free(extraOtherInfos[i].value);
- };
- };
- };
- return 0;
-};
+ for(i=0; i<maxOtherInfosSupported; ++i) {
+ if (extraOtherInfos[i].oidval!=-1 ) {
+ extraOtherInfos[i].oidval=-1;
+ free(extraOtherInfos[i].value);
+ }
+ }
+ }
+ return 0;
+}
static int cmd_help (char *line);
char *ad;
completerFunctionType rl_completerfunction;
int complete_filenames;
- char **local_tabcompletes;
+ char **local_tabcompletes;
} cmd[] = {
{"open", cmd_open, "('tcp'|'ssl')':<host>[':'<port>][/<db>]",NULL,0,NULL},
{"quit", cmd_quit, "",NULL,0,NULL},
{"querytype", cmd_querytype, "<type>",complete_querytype,0,NULL},
{"refid", cmd_refid, "<id>",NULL,0,NULL},
{"itemorder", cmd_itemorder, "ill|item <itemno>",NULL,0,NULL},
- {"update", cmd_update, "<item>",NULL,0,NULL},
+ {"update", cmd_update, "<action> <recid> [<file>]",NULL,0,NULL},
{"packagename", cmd_packagename, "<packagename>",NULL,0,NULL},
{"proxy", cmd_proxy, "[('tcp'|'ssl')]<host>[':'<port>]",NULL,0,NULL},
{"charset", cmd_charset, "<charset_name>",NULL,0,NULL},
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;
}
*(++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);
/* 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)
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;
}
}
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)
{
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)
{
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
*/