X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=client%2Fclient.c;h=53c241b30e1cb4f6443ac46e53ed65a73490276d;hb=3b792849c676d96918850e2f1e0af87a75278501;hp=82c78cae39d9f642d7ab253089c88d3e4204fe0b;hpb=3ebf9c87afb52af8cc6e696ffbb040aeca68b3f4;p=yaz-moved-to-github.git diff --git a/client/client.c b/client/client.c index 82c78ca..53c241b 100644 --- a/client/client.c +++ b/client/client.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2007, Index Data ApS * See the file LICENSE for details. * - * $Id: client.c,v 1.342 2007-05-30 21:56:59 adam Exp $ + * $Id: client.c,v 1.352 2007-10-29 09:16:32 adam Exp $ */ /** \file client.c * \brief yaz-client program @@ -90,7 +90,8 @@ static file_history_t file_history = 0; -static char *sru_method = "soap"; +static char sru_method[10] = "soap"; +static char sru_version[10] = "1.2"; static char *codeset = 0; /* character set for output */ static int hex_dump = 0; static char *dump_file_prefix = 0; @@ -171,9 +172,6 @@ static cql_transform_t cqltrans = 0; /* CQL context-set handle */ int rl_attempted_completion_over = 0; #endif -/* set this one to 1, to avoid decode of unknown MARCs */ -#define AVOID_MARC_DECODE 1 - #define maxOtherInfosSupported 10 struct eoi { Odr_oid oid[OID_SIZE]; @@ -846,8 +844,8 @@ int cmd_authentication(const char *arg) au.which = Z_IdAuthentication_idPass; au.u.idPass = &idPass; idPass.groupId = NULL; - idPass.userId = user; - idPass.password = group; + idPass.userId = !strcmp(user, "-") ? 0 : user; + idPass.password = !strcmp(group, "-") ? 0 : group; printf("Authentication set to User (%s), Pass (%s)\n", user, group); } if (r == 3) @@ -1276,15 +1274,15 @@ static int send_srw(Z_SRW_PDU *sr) gdu = z_get_HTTP_Request_host_path(out, host_port, path); - if (!strcmp(sru_method, "get")) + if (!yaz_matchstr(sru_method, "get")) { yaz_sru_get_encode(gdu->u.HTTP_Request, sr, out, charset); } - else if (!strcmp(sru_method, "post")) + else if (!yaz_matchstr(sru_method, "post")) { yaz_sru_post_encode(gdu->u.HTTP_Request, sr, out, charset); } - else if (!strcmp(sru_method, "soap")) + else if (!yaz_matchstr(sru_method, "soap")) { yaz_sru_soap_encode(gdu->u.HTTP_Request, sr, out, charset); } @@ -1347,7 +1345,7 @@ static int send_SRW_scanRequest(const char *arg, int pos, int num) Z_SRW_PDU *sr = 0; /* regular requestse .. */ - sr = yaz_srw_get(out, Z_SRW_scan_request); + sr = yaz_srw_get_pdu(out, Z_SRW_scan_request, sru_version); switch(queryType) { @@ -1382,10 +1380,11 @@ static int send_SRW_searchRequest(const char *arg) setno = 1; /* save this for later .. when fetching individual records */ - srw_sr = yaz_srw_get(srw_sr_odr_out, Z_SRW_searchRetrieve_request); + srw_sr = yaz_srw_get_pdu(srw_sr_odr_out, Z_SRW_searchRetrieve_request, + sru_version); /* regular request .. */ - sr = yaz_srw_get(out, Z_SRW_searchRetrieve_request); + sr = yaz_srw_get_pdu(out, Z_SRW_searchRetrieve_request, sru_version); switch(queryType) { @@ -1918,6 +1917,20 @@ void process_ESResponse(Z_ExtendedServicesResponse *res) } } } + if (ext->which == Z_External_itemOrder) + { + Z_IOTaskPackage *otp = ext->u.itemOrder->u.taskPackage; + if (otp && otp->targetPart && otp->targetPart->itemRequest) + { + Z_External *ext = otp->targetPart->itemRequest; + if (ext->which == Z_External_octet) + { + Odr_oct *doc = ext->u.octet_aligned; + printf("Got itemRequest doc %.*s\n", + doc->len, doc->buf); + } + } + } } if (res->taskPackage && res->taskPackage->which == Z_External_octet) { @@ -2508,19 +2521,26 @@ static int cmd_sru(const char *arg) if (!*arg) { printf("SRU method is: %s\n", sru_method); + printf("SRU version is: %s\n", sru_version); } else { - if (!yaz_matchstr(arg, "post")) - sru_method = "post"; - else if (!yaz_matchstr(arg, "get")) - sru_method = "get"; - else if (!yaz_matchstr(arg, "soap")) - sru_method = "soap"; - else + int r; + r = sscanf(arg, "%9s %9s", sru_method, sru_version); + if (r >= 1) { - printf("Unknown SRU method: %s\n", arg); - printf("Specify one of POST, GET, SOAP\n"); + if (!yaz_matchstr(sru_method, "post")) + ; + else if (!yaz_matchstr(sru_method, "get")) + ; + else if (!yaz_matchstr(sru_method, "soap")) + ; + else + { + strcpy(sru_method, "soap"); + printf("Unknown SRU method: %s\n", arg); + printf("Specify one of POST, GET, SOAP\n"); + } } } return 0; @@ -3021,13 +3041,13 @@ void display_term(Z_TermInfo *t) if (t->displayTerm) printf("%s", t->displayTerm); else if (t->term->which == Z_Term_general) - { printf("%.*s", t->term->u.general->len, t->term->u.general->buf); - sprintf(last_scan_line, "%.*s", t->term->u.general->len, - t->term->u.general->buf); - } else printf("Term (not general)"); + if (t->term->which == Z_Term_general) + sprintf(last_scan_line, "%.*s", t->term->u.general->len, + t->term->u.general->buf); + if (t->globalOccurrences) printf (" (%d)\n", *t->globalOccurrences); else @@ -3750,19 +3770,42 @@ int cmd_push_command(const char* arg) return 1; } -void source_rcfile(void) +void source_rc_file(const char *rc_file) { - /* Look for a $HOME/.yazclientrc and source it if it exists */ + /* If rc_file != NULL, source that. Else + Look for .yazclientrc and read it if it exists. + If it does not exist, read $HOME/.yazclientrc instead */ struct stat statbuf; - char fname[1000]; - char* homedir = getenv("HOME"); - - sprintf(fname, "%.500s%s%s", homedir ? homedir : "", - homedir ? "/" : "", - ".yazclientrc"); - if (stat(fname,&statbuf)==0) - cmd_source(fname, 0 ); + if (rc_file) + { + if (stat(rc_file, &statbuf) == 0) + cmd_source(rc_file, 0); + else + { + fprintf(stderr, "yaz_client: cannot source '%s'\n", rc_file); + exit(1); + } + } + else + { + char fname[1000]; + strcpy(fname, ".yazclientrc"); + if (stat(fname, &statbuf)==0) + { + cmd_source(fname, 0); + } + else + { + const char* homedir = getenv("HOME"); + if (homedir) + { + sprintf(fname, "%.800s/%s", homedir, ".yazclientrc"); + if (stat(fname, &statbuf)==0) + cmd_source(fname, 0); + } + } + } } void add_to_readline_history(void *client_data, const char *line) @@ -3773,7 +3816,7 @@ void add_to_readline_history(void *client_data, const char *line) #endif } -static void initialize(void) +static void initialize(const char *rc_file) { FILE *inf; int i; @@ -3812,7 +3855,7 @@ static void initialize(void) cmd_format("usmarc"); - source_rcfile(); + source_rc_file(rc_file); file_history = file_history_new(); file_history_load(file_history); @@ -3923,7 +3966,7 @@ static void http_response(Z_HTTP_Response *hres) const char *connection_head = z_HTTP_header_lookup(hres->headers, "Connection"); if (!yaz_srw_check_content_type(hres)) - printf("Content type does not appear to be XML"); + printf("Content type does not appear to be XML\n"); else { Z_SOAP *soap_package = 0; @@ -4496,7 +4539,7 @@ static struct { {"zversion", cmd_zversion, "", NULL, 0, NULL}, {"help", cmd_help, "", NULL,0,NULL}, {"init", cmd_init, "", NULL,0,NULL}, - {"sru", cmd_sru, "", NULL,0,NULL}, + {"sru", cmd_sru, " ", NULL,0,NULL}, {"exit", cmd_quit, "",NULL,0,NULL}, {0,0,0,0,0,0} }; @@ -4820,6 +4863,7 @@ int main(int argc, char **argv) char *open_command = 0; char *auth_command = 0; char *arg; + const char *rc_file = 0; int ret; #if HAVE_LOCALE_H @@ -4844,7 +4888,7 @@ int main(int argc, char **argv) ODR_MASK_SET(&z3950_options, Z_Options_delSet); ODR_MASK_SET(&z3950_options, Z_Options_negotiationModel); - while ((ret = options("k:c:q:a:b:m:v:p:u:t:Vxd:", argv, argc, &arg)) != -2) + while ((ret = options("k:c:q:a:b:m:v:p:u:t:Vxd:f:", argv, argc, &arg)) != -2) { switch (ret) { @@ -4862,9 +4906,28 @@ int main(int argc, char **argv) exit(1); } break; + case 'a': + if (!strcmp(arg, "-")) + apdu_file=stderr; + else + apdu_file=fopen(arg, "a"); + break; + case 'b': + if (!strcmp(arg, "-")) + ber_file=stderr; + else + ber_file=fopen(arg, "a"); + break; + case 'c': + strncpy (ccl_fields, arg, sizeof(ccl_fields)-1); + ccl_fields[sizeof(ccl_fields)-1] = '\0'; + break; case 'd': dump_file_prefix = arg; break; + case 'f': + rc_file = arg; + break; case 'k': kilobytes = atoi(arg); break; @@ -4875,34 +4938,15 @@ int main(int argc, char **argv) exit (1); } break; - case 't': - outputCharset = xstrdup(arg); - break; - case 'c': - strncpy (ccl_fields, arg, sizeof(ccl_fields)-1); - ccl_fields[sizeof(ccl_fields)-1] = '\0'; + case 'p': + yazProxy = xstrdup(arg); break; case 'q': strncpy (cql_fields, arg, sizeof(cql_fields)-1); cql_fields[sizeof(cql_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 'x': - hex_dump = 1; - break; - case 'p': - yazProxy = xstrdup(arg); + case 't': + outputCharset = xstrdup(arg); break; case 'u': if (!auth_command) @@ -4918,24 +4962,31 @@ int main(int argc, char **argv) case 'V': show_version(); break; + case 'x': + hex_dump = 1; + break; default: fprintf (stderr, "Usage: %s " - " [-a ]" + " [-a apdulog]" " [-b berdump]" - " [-d dump]\n" - " [-c cclfields]" + " [-c cclfile]" + " [-d dump]" + " [-f cmdfile]" " [-k size]" - " [-m ]\n" - " [-p ]" - " [-q cqlfields]" - " [-u ]" + " [-m marclog]" + " [-p proxy-addr]" + " [-q cqlfile]" + " [-t dispcharset]" + " [-u auth]" + " [-v loglevel]" " [-V]" - " []\n", + " [-x]" + " [server-addr]\n", prog); exit (1); } } - initialize(); + initialize(rc_file); if (auth_command) { #ifdef HAVE_GETTIMEOFDAY