/*
- * Copyright (c) 1995-2002, Index Data
+ * Copyright (c) 1995-2003, Index Data
* See the file LICENSE for details.
*
- * $Id: client.c,v 1.170 2002-09-17 21:19:38 adam Exp $
+ * $Id: client.c,v 1.185 2003-03-11 11:07:47 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>
#include <sys/stat.h>
-
#include "admin.h"
#include "tabcomplete.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 FILE *ber_file = 0;
static COMSTACK conn = 0; /* our z-association */
static Z_IdAuthentication *auth = 0; /* our current auth definition */
char *databaseNames[128];
static char* yazCharset = 0;
static char* yazLang = 0;
-
static char last_cmd[32] = "?";
-static FILE *marcdump = 0;
+static FILE *marc_file = 0;
static char *refid = NULL;
static char *last_open_command = NULL;
static int auto_reconnect = 0;
typedef enum {
QueryType_Prefix,
QueryType_CCL,
- QueryType_CCL2RPN
+ QueryType_CCL2RPN,
+ QueryType_CQL
} QueryType;
static QueryType queryType = QueryType_Prefix;
/* set this one to 1, to avoid decode of unknown MARCs */
#define AVOID_MARC_DECODE 1
-/* nice helper macro as extensive tabbing gives spaces at the en of the args lines */
-#define REMOVE_TAILING_BLANKS(a) {\
- char* args_end=(a)+strlen(a)-1; \
- while(isspace(*args_end)) {*args_end=0;--args_end;}; \
- }
-
#define maxOtherInfosSupported 10
struct {
int oidval;
- char* value;
+ char* value;
} extraOtherInfos[maxOtherInfosSupported];
char ** readline_completer(char *text, int start, int end);
char *command_generator(const char *text, int state);
char** curret_global_list=NULL;
-int cmd_register_tab(char* arg);
+int cmd_register_tab(const char* arg);
+
+static void close_session (void);
ODR getODROutputStream()
{
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";
}
#endif
}
-
-
void add_otherInfos(Z_APDU *a)
{
Z_OtherInformation **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);
+ yaz_oi_set_string_oidval(oi, out, extraOtherInfos[i].oidval,
+ 1, extraOtherInfos[i].value);
}
}
if (!z_APDU(out, &a, 0, 0))
{
odr_perror(out, "Encoding APDU");
- exit(1);
+ close_session();
+ return;
}
buf = odr_getbuf(out, &len, 0);
+ if (ber_file)
+ odr_dumpBER(ber_file, buf, len);
/* printf ("sending APDU of size %d\n", len); */
if (cs_put(conn, buf, len) < 0)
{
fprintf(stderr, "cs_put: %s", cs_errmsg(cs_errno(conn)));
- exit(1);
+ close_session();
+ return;
}
-
do_hex_dump(buf,len);
odr_reset(out); /* release the APDU structure */
}
static int process_initResponse(Z_InitResponse *res)
{
+ int ver = 0;
/* save session parameters for later use */
session_mem = odr_extract_mem(in);
session = res;
+ for (ver = 0; ver<5; ver++)
+ if (!ODR_MASK_GET(res->protocolVersion, ver))
+ break;
+
if (!*res->result)
- printf("Connection rejected by target.\n");
+ printf("Connection rejected by v%d target.\n", ver);
else
- printf("Connection accepted by target.\n");
+ printf("Connection accepted by v%d target.\n", ver);
if (res->implementationId)
printf("ID : %s\n", res->implementationId);
if (res->implementationName)
return 0;
}
-static int cmd_base(char *arg)
+static int cmd_base(const char *arg)
{
int i;
- char *cp;
+ const char *cp;
if (!*arg)
{
return 1;
}
-void cmd_open_remember_last_open_command(char* arg, char* new_open_command)
+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);
- }
+ if(last_open_command != arg)
+ {
+ if(last_open_command) xfree(last_open_command);
+ last_open_command = xstrdup(new_open_command);
+ }
}
-int cmd_open(char *arg)
+int cmd_open(const char *arg)
{
void *add;
- char type_and_host[101], base[101];
-
+ char type_and_host[101];
+ const char *basep = 0;
if (conn)
{
printf("Already connected.\n");
session_mem = NULL;
}
}
+ cs_get_host_args(arg, &basep);
- if (strncmp (arg, "unix:", 5) == 0)
- {
- base[0] = '\0';
- conn = cs_create_host(arg, 1, &add);
- cmd_open_remember_last_open_command(arg,arg);
- }
+ cmd_open_remember_last_open_command(arg,type_and_host);
+
+ if (yazProxy)
+ conn = cs_create_host(yazProxy, 1, &add);
else
- {
- base[0] = '\0';
- if (sscanf (arg, "%100[^/]/%100s", type_and_host, base) < 1)
- return 0;
-
- cmd_open_remember_last_open_command(arg,type_and_host);
- if (yazProxy)
- conn = cs_create_host(yazProxy, 1, &add);
- else
- conn = cs_create_host(type_and_host, 1, &add);
- }
+ conn = cs_create_host(arg, 1, &add);
if (!conn)
{
printf ("Couldn't create comstack\n");
return 0;
}
+ if (conn->protocol == PROTO_HTTP)
+ {
+ printf("HTTP transport not supported\n");
+ cs_close(conn);
+ conn = 0;
+ return 0;
+ }
printf("Connecting...");
fflush(stdout);
if (cs_connect(conn, add) < 0)
{
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;
}
- printf("Ok.\n");
-
- send_initRequest(type_and_host);
- if (*base)
- cmd_base (base);
-
+ printf("OK.\n");
+ if (conn->protocol == PROTO_Z3950)
+ send_initRequest(type_and_host);
+ if (basep && *basep)
+ cmd_base (basep);
return 2;
}
void try_reconnect()
{
-
- char* open_command;
+ char* open_command;
- if(!( auto_reconnect && last_open_command) ) return ;
+ if(!( auto_reconnect && last_open_command) ) return ;
- open_command = (char *) xmalloc (strlen(last_open_command)+6);
- strcpy (open_command, "open ");
+ open_command = (char *) xmalloc (strlen(last_open_command)+6);
+ strcpy (open_command, "open ");
- strcat (open_command, last_open_command);
+ strcat (open_command, last_open_command);
- process_cmd_line(open_command);
+ process_cmd_line(open_command);
- xfree(open_command);
+ xfree(open_command);
}
-int cmd_authentication(char *arg)
+int cmd_authentication(const char *arg)
{
static Z_IdAuthentication au;
static char user[40], group[40], pass[40];
/* 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;
if (!(*type->fun)(in, (char **)&rr, 0, 0))
{
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,
+ fprintf(stdout, "[Near %d]\n", odr_offset(in));
+ fprintf(stdout, "Packet dump:\n---------\n");
+ odr_dumpBER(stdout, (char*)r->u.octet_aligned->buf,
r->u.octet_aligned->len);
- fprintf(stderr, "---------\n");
+ fprintf(stdout, "---------\n");
/* note just ignores the error ant print the bytes form the octet_aligned later */
} else {
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
{
r->u.octet_aligned->len);
}
}
- if (marcdump)
- fwrite (octet_buf, 1, r->u.octet_aligned->len, marcdump);
+ if (marc_file)
+ fwrite (octet_buf, 1, r->u.octet_aligned->len, marc_file);
}
else if (ent && ent->value == VAL_SUTRS)
{
}
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
{
}
}
-static int send_deleteResultSetRequest(char *arg)
+static int send_deleteResultSetRequest(const char *arg)
{
char names[8][32];
int i;
return 2;
}
-static int send_searchRequest(char *arg)
+static int send_searchRequest(const char *arg)
{
Z_APDU *apdu = zget_APDU(out, Z_APDU_searchRequest);
Z_SearchRequest *req = apdu->u.searchRequest;
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 = (Z_External *) 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;
r->u.single_ASN1_type->size = item_request_size;
memcpy (r->u.single_ASN1_type->buf, item_request_buf,
item_request_size);
-
- do_hex_dump(item_request_buf,item_request_size);
+
+ do_hex_dump(item_request_buf,item_request_size);
}
return r;
}
return 0;
}
-static int cmd_update(char *arg)
+static int cmd_update(const char *arg)
{
Z_APDU *apdu = zget_APDU(out, Z_APDU_extendedServicesRequest );
Z_ExtendedServicesRequest *req = apdu->u.extendedServicesRequest;
if (S_ISREG(status.st_mode) && (inf = fopen(fname, "r")))
{
size_t len = status.st_size;
- char *buf = xmalloc (len);
+ char *buf = (char *) xmalloc (len);
fread (buf, 1, len, inf);
notToKeep->elements[0]->which = Z_IUSuppliedRecords_elem_opaque;
if (*recid)
{
- notToKeep->elements[0]->u.opaque = odr_malloc (out, sizeof(Odr_oct));
- notToKeep->elements[0]->u.opaque->buf = 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);
}
return 2;
}
-static int cmd_itemorder(char *arg)
+static int cmd_itemorder(const char *arg)
{
char type[12];
int itemno;
return 2;
}
-static int cmd_find(char *arg)
+static int cmd_find(const char *arg)
{
if (!*arg)
{
}
if (!conn)
{
- try_reconnect();
-
- if (!conn) {
- printf("Not connected yet\n");
- return 0;
- };
+ try_reconnect();
+
+ if (!conn) {
+ printf("Not connected yet\n");
+ return 0;
+ }
}
if (!send_searchRequest(arg))
return 0;
return 2;
}
-static int cmd_delete(char *arg)
+static int cmd_delete(const char *arg)
{
if (!conn)
{
return 2;
}
-static int cmd_ssub(char *arg)
+static int cmd_ssub(const char *arg)
{
if (!(smallSetUpperBound = atoi(arg)))
return 0;
return 1;
}
-static int cmd_lslb(char *arg)
+static int cmd_lslb(const char *arg)
{
if (!(largeSetLowerBound = atoi(arg)))
return 0;
return 1;
}
-static int cmd_mspn(char *arg)
+static int cmd_mspn(const char *arg)
{
if (!(mediumSetPresentNumber = atoi(arg)))
return 0;
return 1;
}
-static int cmd_status(char *arg)
+static int cmd_status(const char *arg)
{
printf("smallSetUpperBound: %d\n", smallSetUpperBound);
printf("largeSetLowerBound: %d\n", largeSetLowerBound);
return 1;
}
-static int cmd_setnames(char *arg)
+static int cmd_setnames(const char *arg)
{
if (*arg == '1') /* enable ? */
setnumber = 0;
/* PRESENT SERVICE ----------------------------- */
-static int send_presentRequest(char *arg)
+static int send_presentRequest(const char *arg)
{
Z_APDU *apdu = zget_APDU(out, Z_APDU_presentRequest);
Z_PresentRequest *req = apdu->u.presentRequest;
compo.u.complex->generic = (Z_Specification *)
odr_malloc(out, sizeof(*compo.u.complex->generic));
- compo.u.complex->generic->schema = (Odr_oid *)
+ compo.u.complex->generic->which = Z_Schema_oid;
+ compo.u.complex->generic->schema.oid = (Odr_oid *)
odr_oiddup(out, oid_ent_to_oid(&prefschema, oid));
- if (!compo.u.complex->generic->schema)
+ if (!compo.u.complex->generic->schema.oid)
{
/* OID wasn't a schema! Try record syntax instead. */
prefschema.oclass = CLASS_RECSYN;
- compo.u.complex->generic->schema = (Odr_oid *)
+ compo.u.complex->generic->schema.oid = (Odr_oid *)
odr_oiddup(out, oid_ent_to_oid(&prefschema, oid));
}
if (!elementSetNames)
session_mem = NULL;
}
sent_close = 0;
+ odr_reset(out);
+ odr_reset(in);
+ odr_reset(print);
}
void process_close(Z_Close *req)
}
}
-static int cmd_show(char *arg)
+static int cmd_show(const char *arg)
{
if (!conn)
{
return 2;
}
-int cmd_quit(char *arg)
+int cmd_quit(const char *arg)
{
printf("See you later, alligator.\n");
xmalloc_trav ("");
return 0;
}
-int cmd_cancel(char *arg)
+int cmd_cancel(const char *arg)
{
Z_APDU *apdu = zget_APDU(out, Z_APDU_triggerResourceControlRequest);
Z_TriggerResourceControlRequest *req =
return 2;
}
-int send_sortrequest(char *arg, int newset)
+int send_sortrequest(const char *arg, int newset)
{
Z_APDU *apdu = zget_APDU(out, Z_APDU_sortRequest);
Z_SortRequest *req = apdu->u.sortRequest;
}
}
-int cmd_sort_generic(char *arg, int newset)
+int cmd_sort_generic(const char *arg, int newset)
{
if (!conn)
{
return 0;
}
-int cmd_sort(char *arg)
+int cmd_sort(const char *arg)
{
return cmd_sort_generic (arg, 0);
}
-int cmd_sort_newset (char *arg)
+int cmd_sort_newset (const char *arg)
{
return cmd_sort_generic (arg, 1);
}
-int cmd_scan(char *arg)
+int cmd_scan(const char *arg)
{
if (!conn)
{
- try_reconnect();
-
- if (!conn) {
- printf("Session not initialized yet\n");
- return 0;
- };
+ try_reconnect();
+
+ if (!conn) {
+ printf("Session not initialized yet\n");
+ return 0;
+ }
}
if (!ODR_MASK_GET(session->options, Z_Options_scan))
{
return 2;
}
-int cmd_schema(char *arg)
+int cmd_schema(const char *arg)
{
if (!arg || !*arg)
{
return 1;
}
-int cmd_format(char *arg)
+int cmd_format(const 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;
}
-int cmd_elements(char *arg)
+int cmd_elements(const char *arg)
{
static Z_ElementSetNames esn;
static char what[100];
return 1;
}
-int cmd_attributeset(char *arg)
+int cmd_attributeset(const char *arg)
{
char what[100];
return 1;
}
-int cmd_querytype (char *arg)
+int cmd_querytype (const char *arg)
{
if (!strcmp (arg, "ccl"))
queryType = QueryType_CCL;
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;
}
-int cmd_refid (char *arg)
+int cmd_refid (const char *arg)
{
xfree (refid);
refid = NULL;
return 1;
}
-int cmd_close(char *arg)
+int cmd_close(const char *arg)
{
Z_APDU *apdu;
Z_Close *req;
return 2;
}
-int cmd_packagename(char* arg)
+int cmd_packagename(const char* arg)
{
xfree (esPackageName);
esPackageName = NULL;
return 1;
}
-int cmd_proxy(char* arg)
+int cmd_proxy(const char* arg)
{
if (*arg == '\0') {
xfree (yazProxy);
return 1;
}
-int cmd_charset(char* arg)
+int cmd_charset(const char* arg)
{
char l1[30], l2[30];
return 1;
}
-int cmd_lang(char* arg)
+int cmd_lang(const char* arg)
{
if (*arg == '\0') {
printf("Current language is `%s'\n", (yazLang)?yazLang:NULL);
return 1;
}
-int cmd_source(char* arg)
+int cmd_source(const char* arg)
{
/* first should open the file and read one line at a time.. */
FILE* includeFile;
char line[1024], *cp;
- {
- char* args_end=(arg)+strlen(arg)-1;
- while(isspace(*args_end))
- {*args_end=0;
- --args_end;};
- }
-
- REMOVE_TAILING_BLANKS(arg);
-
if(strlen(arg)<1) {
fprintf(stderr,"Error in source command use a filename\n");
return -1;
return 1;
}
-int cmd_subshell(char* args)
+int cmd_subshell(const char* args)
{
if(strlen(args))
system(args);
return 1;
}
-int cmd_set_apdufile(char* arg)
+int cmd_set_berfile(const char *arg)
{
- REMOVE_TAILING_BLANKS(arg);
-
- if(apdu_file && apdu_file != stderr) { /* don't close stdout*/
- perror("unable to close apdu log file");
- }
- apdu_file=NULL;
-
- if(strlen(arg)<1) {
- return 1;
- }
-
- if(!strcmp(arg,"-"))
- apdu_file=stderr;
- else
- apdu_file=fopen(arg, "a");
-
- if(!apdu_file) {
- perror("unable to open apdu log file no apdu log loaded");
- } else {
- odr_setprint(print, apdu_file);
+ if (ber_file && ber_file != stdout && ber_file != stderr)
+ fclose(ber_file);
+ if (!strcmp(arg, ""))
+ ber_file = 0;
+ else if (!strcmp(arg, "-"))
+ ber_file = stdout;
+ else
+ ber_file = fopen(arg, "a");
+ return 1;
+}
+
+int cmd_set_apdufile(const char *arg)
+{
+ if(apdu_file && apdu_file != stderr && apdu_file != stderr)
+ fclose(apdu_file);
+ if (!strcmp(arg, ""))
+ apdu_file = 0;
+ else if (!strcmp(arg, "-"))
+ apdu_file = stderr;
+ else
+ {
+ apdu_file = fopen(arg, "a");
+ if (!apdu_file)
+ perror("unable to open apdu log file");
}
-
return 1;
}
-int cmd_set_cclfile(char* arg)
+int cmd_set_cclfile(const char* arg)
{
FILE *inf;
- REMOVE_TAILING_BLANKS(arg);
-
bibset = ccl_qual_mk ();
inf = fopen (arg, "r");
- if (inf)
+ if (!inf)
+ perror("unable to open CCL file");
+ else
{
ccl_qual_file (bibset, inf);
fclose (inf);
return 0;
}
-
-int cmd_set_auto_reconnect(char* arg)
+int cmd_set_auto_reconnect(const char* arg)
{
- REMOVE_TAILING_BLANKS(arg);
-
if(strlen(arg)==0) {
auto_reconnect = ! auto_reconnect;
} else if(strcmp(arg,"on")==0) {
return 0;
}
-int cmd_set_marcdump(char* arg)
+int cmd_set_marcdump(const char* arg)
{
- if(marcdump && marcdump != stderr) { /* don't close stdout*/
- perror("unable to close apdu log file");
+ if(marc_file && marc_file != stderr) { /* don't close stdout*/
+ fclose(marc_file);
}
- marcdump=NULL;
-
- 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");
+
+ if (!strcmp(arg, ""))
+ marc_file = 0;
+ else if (!strcmp(arg, "-"))
+ marc_file = stderr;
+ else
+ {
+ marc_file = fopen(arg, "a");
+ if (!marc_file)
+ perror("unable to open marc log file");
}
-
return 1;
}
-int cmd_set_proxy(char* arg)
+int cmd_set_proxy(const char* arg)
{
if(yazProxy) free(yazProxy);
yazProxy=NULL;
/*
this command takes 3 arge {name class oid}
*/
-int cmd_register_oid(char* args) {
+int cmd_register_oid(const char* args) {
static struct {
char* className;
oid_class oclass;
{"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;
return 1;
}
-int cmd_push_command(char* arg)
+int cmd_push_command(const char* arg)
{
#if HAVE_READLINE_HISTORY_H
if(strlen(arg)>1)
odr_setbuf(in, netbuffer, res, 0);
if (!z_APDU(in, &apdu, 0, 0))
{
+ FILE *f = ber_file ? ber_file : stdout;
odr_perror(in, "Decoding incoming APDU");
- fprintf(stderr, "[Near %d]\n", odr_offset(in));
- fprintf(stderr, "Packet dump:\n---------\n");
- odr_dumpBER(stderr, netbuffer, res);
- fprintf(stderr, "---------\n");
+ fprintf(f, "[Near %d]\n", odr_offset(in));
+ fprintf(f, "Packet dump:\n---------\n");
+ odr_dumpBER(f, netbuffer, res);
+ fprintf(f, "---------\n");
if (apdu_file)
z_APDU(print, &apdu, 0, 0);
close_session ();
break;
}
+ if (ber_file)
+ odr_dumpBER(ber_file, netbuffer, res);
if (apdu_file && !z_APDU(print, &apdu, 0, 0))
{
odr_perror(print, "Failed to print incoming APDU");
}
-int cmd_cclparse(char* arg)
+int cmd_cclparse(const char* arg)
{
int error, pos;
struct ccl_rpn_node *rpn=NULL;
}
-int cmd_set_otherinfo(char* args)
+int cmd_set_otherinfo(const char* args)
{
char oid[101], otherinfoString[101];
int otherinfoNo;
return 0;
}
-int cmd_list_otherinfo(char* args)
+int cmd_list_otherinfo(const char* args)
{
int 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);
+ 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(extraOtherInfos[i].oidval,CLASS_RECSYN), extraOtherInfos[i].value);
+ printf(" otherinfo %d %s %s\n",
+ i,
+ yaz_z3950_oid_value_to_str(
+ (enum oid_value) extraOtherInfos[i].oidval,
+ CLASS_RECSYN),
+ extraOtherInfos[i].value);
}
}
}
-int cmd_list_all(char* args) {
+int cmd_list_all(const char* args) {
int i;
/* connection options */
/* loging options */
printf("APDU log : %s\n",apdu_file?"on":"off");
- printf("Record log : %s\n",marcdump?"on":"off");
+ printf("Record log : %s\n",marc_file?"on":"off");
/* other infos */
printf("Other Info: \n");
return 0;
}
-int cmd_clear_otherinfo(char* args)
+int cmd_clear_otherinfo(const char* args)
{
if(strlen(args)>0) {
int otherinfoNo;
return 0;
}
-static int cmd_help (char *line);
+static int cmd_help (const char *line);
typedef char *(*completerFunctionType)(const char *text, int state);
static struct {
char *cmd;
- int (*fun)(char *arg);
+ int (*fun)(const char *arg);
char *ad;
completerFunctionType rl_completerfunction;
int complete_filenames;
char **local_tabcompletes;
-} cmd[] = {
+} cmd_array[] = {
{"open", cmd_open, "('tcp'|'ssl')':<host>[':'<port>][/<db>]",NULL,0,NULL},
{"quit", cmd_quit, "",NULL,0,NULL},
{"find", cmd_find, "<query>",NULL,0,NULL},
{".", cmd_source, "<filename>",NULL,1,NULL},
{"!", cmd_subshell, "Subshell command",NULL,1,NULL},
{"set_apdufile", cmd_set_apdufile, "<filename>",NULL,1,NULL},
+ {"set_berfile", cmd_set_berfile, "<filename>",NULL,1,NULL},
{"set_marcdump", cmd_set_marcdump," <filename>",NULL,1,NULL},
{"set_cclfile", cmd_set_cclfile," <filename>",NULL,1,NULL},
{"set_auto_reconnect", cmd_set_auto_reconnect," on|off",complete_auto_reconnect,1,NULL},
{"set_otherinfo", cmd_set_otherinfo,"<otherinfoinddex> <oid> <string>",NULL,0,NULL},
{"register_oid", cmd_register_oid,"<name> <class> <oid>",NULL,0,NULL},
{"push_command", cmd_push_command,"<command>",command_generator,0,NULL},
- {"register_tab", cmd_register_tab,"<commandname> <tab>",command_generator,0,NULL},
- {"cclparse", cmd_cclparse,"<ccl find command>",NULL,0,NULL},
- {"list_otherinfo",cmd_list_otherinfo,"[otherinfoinddex]",NULL,0,NULL},
- {"list_all",cmd_list_all,"",NULL,0,NULL},
- {"clear_otherinfo",cmd_clear_otherinfo,"",NULL,0,NULL},
+ {"register_tab", cmd_register_tab,"<commandname> <tab>",command_generator,0,NULL},
+ {"cclparse", cmd_cclparse,"<ccl find command>",NULL,0,NULL},
+ {"list_otherinfo",cmd_list_otherinfo,"[otherinfoinddex]",NULL,0,NULL},
+ {"list_all",cmd_list_all,"",NULL,0,NULL},
+ {"clear_otherinfo",cmd_clear_otherinfo,"",NULL,0,NULL},
/* Server Admin Functions */
{"adm-reindex", cmd_adm_reindex, "<database-name>",NULL,0,NULL},
{"adm-truncate", cmd_adm_truncate, "('database'|'index')<object-name>",NULL,0,NULL},
{0,0,0,0,0,0}
};
-static int cmd_help (char *line)
+static int cmd_help (const char *line)
{
int i;
char topic[21];
if (*topic == 0)
printf("Commands:\n");
- for (i = 0; cmd[i].cmd; i++)
- if (*topic == 0 || strcmp (topic, cmd[i].cmd) == 0)
- printf(" %s %s\n", cmd[i].cmd, cmd[i].ad);
+ for (i = 0; cmd_array[i].cmd; i++)
+ if (*topic == 0 || strcmp (topic, cmd_array[i].cmd) == 0)
+ printf(" %s %s\n", cmd_array[i].cmd, cmd_array[i].ad);
if (strcmp (topic, "find") == 0)
{
printf ("RPN:\n");
return 1;
}
-int cmd_register_tab(char* arg) {
+int cmd_register_tab(const char* arg) {
char command[101], tabargument[101];
int i;
}
/* locate the amdn in the list */
- for (i = 0; cmd[i].cmd; i++) {
- if (!strncmp(cmd[i].cmd, command, strlen(command))) {
+ for (i = 0; cmd_array[i].cmd; i++) {
+ if (!strncmp(cmd_array[i].cmd, command, strlen(command))) {
break;
}
}
- if(!cmd[i].cmd) {
+ if(!cmd_array[i].cmd) {
fprintf(stderr,"Unknown command %s\n",command);
return 1;
}
- if(!cmd[i].local_tabcompletes) {
- cmd[i].local_tabcompletes = calloc(1,sizeof(char**));
- }
+ if(!cmd_array[i].local_tabcompletes)
+ cmd_array[i].local_tabcompletes = (char **) calloc(1,sizeof(char**));
num_of_tabs=0;
- tabslist = cmd[i].local_tabcompletes;
+ tabslist = cmd_array[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;
+ cmd_array[i].local_tabcompletes = (char **)
+ realloc(cmd_array[i].local_tabcompletes,(num_of_tabs+2)*sizeof(char**));
+ tabslist=cmd_array[i].local_tabcompletes;
tabslist[num_of_tabs]=strdup(tabargument);
tabslist[num_of_tabs+1]=NULL;
return 1;
/* removed tailing spaces from the arg command */
{
- char* p;
+ char* p = arg;
char* lastnonspace=NULL;
- p = arg;
for(;*p; ++p) {
if(!isspace(*p)) {
*(++lastnonspace) = 0;
}
-
- for (i = 0; cmd[i].cmd; i++)
- if (!strncmp(cmd[i].cmd, word, strlen(word)))
+ for (i = 0; cmd_array[i].cmd; i++)
+ if (!strncmp(cmd_array[i].cmd, word, strlen(word)))
{
- res = (*cmd[i].fun)(arg);
+ res = (*cmd_array[i].fun)(arg);
break;
}
- if (!cmd[i].cmd) /* dump our help-screen */
+ if (!cmd_array[i].cmd) /* dump our help-screen */
{
printf("Unknown command: %s.\n", word);
printf("use help for list of commands\n");
if(apdu_file)
fflush(apdu_file);
- if(marcdump)
- fflush(marcdump);
+ if(marc_file)
+ fflush(marc_file);
}
if (state==0) {
idx = 0;
}
- for( ; cmd[idx].cmd; ++idx) {
- if (!strncmp(cmd[idx].cmd,text,strlen(text))) {
+ for( ; cmd_array[idx].cmd; ++idx) {
+ if (!strncmp(cmd_array[idx].cmd,text,strlen(text))) {
++idx; /* skip this entry on the next run */
- return strdup(cmd[idx-1].cmd);
+ return strdup(cmd_array[idx-1].cmd);
}
}
return NULL;
return NULL;
}
- for (i = 0; cmd[i].cmd; i++) {
- if (!strncmp(cmd[i].cmd, word, strlen(word))) {
+ for (i = 0; cmd_array[i].cmd; i++) {
+ if (!strncmp(cmd_array[i].cmd, word, strlen(word))) {
break;
}
}
- if(!cmd[i].cmd) return NULL;
+ if(!cmd_array[i].cmd) return NULL;
+ curret_global_list = cmd_array[i].local_tabcompletes;
- curret_global_list = cmd[i].local_tabcompletes;
-
- completerToUse = cmd[i].rl_completerfunction;
+ completerToUse = cmd_array[i].rl_completerfunction;
if(completerToUse==NULL) /* if no pr. command completer is defined use the default completer */
completerToUse = default_completer;
completion_matches(text,
(CPFunction*)completerToUse);
#endif
- if(!cmd[i].complete_filenames)
+ if(!cmd_array[i].complete_filenames)
rl_attempted_completion_over = 1;
return res;
} else {
- if(!cmd[i].complete_filenames)
+ if(!cmd_array[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
+#ifdef CODESET
+ codeset = nl_langinfo(CODESET);
+#endif
+#endif
+
+ while ((ret = options("k:c:a:b:m:v:p:u:t:", argv, argc, &arg)) != -2)
{
switch (ret)
{
kilobytes = atoi(arg);
break;
case 'm':
- if (!(marcdump = fopen (arg, "a")))
+ if (!(marc_file = fopen (arg, "a")))
{
perror (arg);
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 'b':
+ if (!strcmp(arg, "-"))
+ ber_file=stderr;
+ else
+ ber_file=fopen(arg, "a");
+ 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)
{
break;
default:
fprintf (stderr, "Usage: %s [-m <marclog>] [ -a <apdulog>] "
- "[-c cclfields]\n [-p <proxy-addr>] [-u <auth>] "
+ "[-b berdump] [-c cclfields]\n [-p <proxy-addr>] [-u <auth>] "
"[-k size] [<server-addr>]\n",
prog);
exit (1);