X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=client%2Fclient.c;h=5492b84be767850ed8f312de2e6b326b7c13dc67;hp=9c449088fcea35ae9a1184433048a51d91e4f02e;hb=73709d08e8f3c85cbca1c8d883aac65bd6ffe8d6;hpb=b584d89b2b0ac60b56496762db23e33b1dd6d2fe diff --git a/client/client.c b/client/client.c index 9c44908..5492b84 100644 --- a/client/client.c +++ b/client/client.c @@ -1,8 +1,11 @@ /* - * Copyright (C) 1995-2005, Index Data ApS + * Copyright (C) 1995-2006, Index Data ApS * See the file LICENSE for details. * - * $Id: client.c,v 1.301 2005-12-02 16:13:50 adam Exp $ + * $Id: client.c,v 1.312 2006-08-15 13:30:00 adam Exp $ + */ +/** \file client.c + * \brief yaz-client program */ #include @@ -78,11 +81,12 @@ #define C_PROMPT "Z> " +static char *sru_method = "soap"; static char *codeset = 0; /* character set for output */ static int hex_dump = 0; static char *dump_file_prefix = 0; static ODR out, in, print; /* encoding and decoding streams */ -#if HAVE_XML2 +#if YAZ_HAVE_XML2 static ODR srw_sr_odr_out = 0; static Z_SRW_PDU *srw_sr = 0; #endif @@ -122,7 +126,6 @@ static int negotiationCharsetVersion = 3; static char *outputCharset = 0; static char *marcCharset = 0; static char* yazLang = 0; -static char* http_version = "1.1"; static char last_cmd[32] = "?"; static FILE *marc_file = 0; @@ -169,9 +172,10 @@ struct { void process_cmd_line(char* line); -char ** readline_completer(char *text, int start, int end); -char *command_generator(const char *text, int state); -char** curret_global_list=NULL; +#if HAVE_READLINE_READLINE_H +char **readline_completer(char *text, int start, int end); +#endif +static char *command_generator(const char *text, int state); int cmd_register_tab(const char* arg); static void close_session (void); @@ -341,12 +345,10 @@ static void send_initRequest(const char* type_and_host) p0->which = Z_OtherInfo_externallyDefinedInfo; p0->information.externallyDefinedInfo = - yaz_set_proposal_charneg( - out, - (const char**)&negotiationCharset, - negotiationCharset ? 1 : 0, - (const char**)&yazLang, yazLang ? 1 : 0, - negotiationCharsetRecords); + yaz_set_proposal_charneg_list(out, ",", + negotiationCharset, + yazLang, + negotiationCharsetRecords); } } @@ -687,7 +689,7 @@ int session_connect(const char *arg) printf ("Couldn't create comstack\n"); return 0; } -#if HAVE_XML2 +#if YAZ_HAVE_XML2 if (conn->protocol == PROTO_HTTP) queryType = QueryType_CQL; #else @@ -882,7 +884,7 @@ static void display_record(Z_External *r) if (!(*type->fun)(in, &rr, 0, 0)) { odr_perror(in, "Decoding constructed record."); - fprintf(stdout, "[Near %d]\n", odr_offset(in)); + fprintf(stdout, "[Near %ld]\n", (long) odr_offset(in)); fprintf(stdout, "Packet dump:\n---------\n"); odr_dumpBER(stdout, (char*)r->u.octet_aligned->buf, r->u.octet_aligned->len); @@ -1255,74 +1257,32 @@ static int send_deleteResultSetRequest(const char *arg) return 2; } -#if HAVE_XML2 +#if YAZ_HAVE_XML2 static int send_srw(Z_SRW_PDU *sr) { const char *charset = negotiationCharset; const char *host_port = cur_host; - char *path = 0; - char ctype[50]; - Z_SOAP_Handler h[2] = { - {"http://www.loc.gov/zing/srw/", 0, (Z_SOAP_fun) yaz_srw_codec}, - {0, 0, 0} - }; - ODR o = odr_createmem(ODR_ENCODE); - int ret; - Z_SOAP *p = odr_malloc(o, sizeof(*p)); Z_GDU *gdu; + char *path = 0; - path = odr_malloc(out, strlen(databaseNames[0])+2); + path = odr_malloc(out, 2+strlen(databaseNames[0])); *path = '/'; strcpy(path+1, databaseNames[0]); - gdu = z_get_HTTP_Request(out); - gdu->u.HTTP_Request->version = http_version; - gdu->u.HTTP_Request->path = odr_strdup(out, path); + gdu = z_get_HTTP_Request_host_path(out, host_port, path); - if (host_port) + if (!strcmp(sru_method, "get")) { - const char *cp0 = strstr(host_port, "://"); - const char *cp1 = 0; - if (cp0) - cp0 = cp0+3; - else - cp0 = host_port; - - cp1 = strchr(cp0, '/'); - if (!cp1) - cp1 = cp0+strlen(cp0); - - if (cp0 && cp1) - { - char *h = odr_malloc(out, cp1 - cp0 + 1); - memcpy (h, cp0, cp1 - cp0); - h[cp1-cp0] = '\0'; - z_HTTP_header_add(out, &gdu->u.HTTP_Request->headers, - "Host", h); - } + yaz_sru_get_encode(gdu->u.HTTP_Request, sr, out, charset); } - - strcpy(ctype, "text/xml"); - if (charset && strlen(charset) < 20) + else if (!strcmp(sru_method, "post")) { - strcat(ctype, "; charset="); - strcat(ctype, charset); + yaz_sru_post_encode(gdu->u.HTTP_Request, sr, out, charset); + } + else if (!strcmp(sru_method, "soap")) + { + yaz_sru_soap_encode(gdu->u.HTTP_Request, sr, out, charset); } - z_HTTP_header_add(out, &gdu->u.HTTP_Request->headers, - "Content-Type", ctype); - z_HTTP_header_add(out, &gdu->u.HTTP_Request->headers, - "SOAPAction", "\"\""); - p->which = Z_SOAP_generic; - p->u.generic = odr_malloc(o, sizeof(*p->u.generic)); - p->u.generic->no = 0; - p->u.generic->ns = 0; - p->u.generic->p = sr; - p->ns = "http://schemas.xmlsoap.org/soap/envelope/"; - - ret = z_soap_codec_enc(o, &p, - &gdu->u.HTTP_Request->content_buf, - &gdu->u.HTTP_Request->content_len, h, - charset); if (z_GDU(out, &gdu, 0, 0)) { @@ -1333,7 +1293,7 @@ static int send_srw(Z_SRW_PDU *sr) if (apdu_file) { if (!z_GDU(print, &gdu, 0, 0)) - printf ("Failed to print outgoing APDU\n"); + printf ("Failed to print outgoing SRU package\n"); odr_reset(print); } buf_out = odr_getbuf(out, &len_out, 0); @@ -1344,8 +1304,6 @@ static int send_srw(Z_SRW_PDU *sr) r = cs_put(conn, buf_out, len_out); - odr_destroy(o); - if (r >= 0) return 2; } @@ -1353,7 +1311,7 @@ static int send_srw(Z_SRW_PDU *sr) } #endif -#if HAVE_XML2 +#if YAZ_HAVE_XML2 static char *encode_SRW_term(ODR o, const char *q) { const char *in_charset = "ISO-8859-1"; @@ -1552,7 +1510,8 @@ static int send_searchRequest(const char *arg) const char *pqf_msg; size_t off; int code = yaz_pqf_error (pqf_parser, &pqf_msg, &off); - printf("%*s^\n", off+4, ""); + int ioff = off; + printf("%*s^\n", ioff+4, ""); printf("Prefix query error: %s (code %d)\n", pqf_msg, code); yaz_pqf_destroy (pqf_parser); @@ -2425,7 +2384,7 @@ static int cmd_explain(const char *arg) { if (protocol != PROTO_HTTP) return 0; -#if HAVE_XML2 +#if YAZ_HAVE_XML2 if (!conn) cmd_open(0); if (conn) @@ -2458,6 +2417,29 @@ static int cmd_init(const char *arg) return 2; } +static int cmd_sru(const char *arg) +{ + if (!*arg) + { + printf("SRU method is: %s\n", sru_method); + } + 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 + { + printf("Unknown SRU method: %s\n", arg); + printf("Specify one of POST, GET, SOAP\n"); + } + } + return 0; +} + static int cmd_find(const char *arg) { if (!*arg) @@ -2467,7 +2449,7 @@ static int cmd_find(const char *arg) } if (protocol == PROTO_HTTP) { -#if HAVE_XML2 +#if YAZ_HAVE_XML2 if (!conn) cmd_open(0); if (!conn) @@ -2675,7 +2657,7 @@ static int send_presentRequest(const char *arg) return 2; } -#if HAVE_XML2 +#if YAZ_HAVE_XML2 static int send_SRW_presentRequest(const char *arg) { char setstring[100]; @@ -2743,7 +2725,7 @@ static int cmd_show(const char *arg) { if (protocol == PROTO_HTTP) { -#if HAVE_XML2 +#if YAZ_HAVE_XML2 if (!conn) cmd_open(0); if (!conn) @@ -2853,7 +2835,8 @@ int send_scanrequest(const char *query, int pp, int num, const char *term) const char *pqf_msg; size_t off; int code = yaz_pqf_error (pqf_parser, &pqf_msg, &off); - printf("%*s^\n", off+7, ""); + int ioff = off; + printf("%*s^\n", ioff+7, ""); printf("Prefix query error: %s (code %d)\n", pqf_msg, code); yaz_pqf_destroy (pqf_parser); return -1; @@ -3063,7 +3046,7 @@ int cmd_scan(const char *arg) { if (protocol == PROTO_HTTP) { -#if HAVE_XML2 +#if YAZ_HAVE_XML2 if (!conn) cmd_open(0); if (!conn) @@ -3250,8 +3233,8 @@ int cmd_packagename(const char* arg) int cmd_proxy(const char* arg) { - xfree (yazProxy); - yazProxy = NULL; + xfree(yazProxy); + yazProxy = 0; if (*arg) yazProxy = xstrdup (arg); return 1; @@ -3705,9 +3688,7 @@ static void initialize(void) #if HAVE_READLINE_READLINE_H rl_attempted_completion_function = (CPPFunction*)readline_completer; #endif - - - for(i=0; irecordPosition) @@ -3947,7 +3928,7 @@ void wait_and_handle_response(int one_response_only) { FILE *f = ber_file ? ber_file : stdout; odr_perror(in, "Decoding incoming APDU"); - fprintf(f, "[Near %d]\n", odr_offset(in)); + fprintf(f, "[Near %ld]\n", (long) odr_offset(in)); fprintf(f, "Packet dump:\n---------\n"); odr_dumpBER(f, netbuffer, res); fprintf(f, "---------\n"); @@ -4018,7 +3999,7 @@ void wait_and_handle_response(int one_response_only) close_session (); } } -#if HAVE_XML2 +#if YAZ_HAVE_XML2 else if (gdu->which == Z_GDU_HTTP_Response) { http_response(gdu->u.HTTP_Response); @@ -4057,7 +4038,8 @@ int cmd_cclparse(const char* arg) rpn = ccl_find_str (bibset, arg, &error, &pos); if (error) { - printf ("%*s^ - ", 3+strlen(last_cmd)+1+pos, " "); + int ioff = 3+strlen(last_cmd)+1+pos; + printf ("%*s^ - ", ioff, " "); printf ("%s\n", ccl_err_msg (error)); } else @@ -4083,7 +4065,8 @@ int cmd_set_otherinfo(const char* args) int sscan_res; int oidval; - sscan_res = sscanf (args, "%d %100[^ ] %100s", &otherinfoNo, oidstr, otherinfoString); + sscan_res = sscanf (args, "%d %100[^ ] %100s", + &otherinfoNo, oidstr, otherinfoString); if (sscan_res==1) { /* reset this otherinfo */ if(otherinfoNo>=maxOtherInfosSupported) { @@ -4092,7 +4075,8 @@ int cmd_set_otherinfo(const char* args) } extraOtherInfos[otherinfoNo].oidval = -1; if (extraOtherInfos[otherinfoNo].value) - free(extraOtherInfos[otherinfoNo].value); + xfree(extraOtherInfos[otherinfoNo].value); + extraOtherInfos[otherinfoNo].value = 0; return 0; } if (sscan_res<3) { @@ -4101,18 +4085,20 @@ int cmd_set_otherinfo(const char* args) } if (otherinfoNo>=maxOtherInfosSupported) { - printf("Error otherinfo index to large (%d>%d)\n", + printf("Error otherinfo index too large (%d>=%d)\n", otherinfoNo,maxOtherInfosSupported); } oidval = oid_getvalbyname (oidstr); - if (oidval == -1 ) { + if (oidval == VAL_NONE) + { printf("Error in set_otherinfo command unknown oid %s \n",oidstr); return 0; } extraOtherInfos[otherinfoNo].oidval = oidval; - if(extraOtherInfos[otherinfoNo].value) free(extraOtherInfos[otherinfoNo].value); - extraOtherInfos[otherinfoNo].value = strdup(otherinfoString); + if (extraOtherInfos[otherinfoNo].value) + xfree(extraOtherInfos[otherinfoNo].value); + extraOtherInfos[otherinfoNo].value = xstrdup(otherinfoString); return 0; } @@ -4242,25 +4228,26 @@ int cmd_list_all(const char* args) { int cmd_clear_otherinfo(const 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); + int otherinfoNo = atoi(args); + if (otherinfoNo >= maxOtherInfosSupported) { + printf("Error otherinfo index too large (%d>=%d)\n", + otherinfoNo, maxOtherInfosSupported); return 0; } - - if(extraOtherInfos[otherinfoNo].oidval != -1) { + if (extraOtherInfos[otherinfoNo].oidval != -1) + { /* only clear if set. */ - extraOtherInfos[otherinfoNo].oidval=-1; - free(extraOtherInfos[otherinfoNo].value); + extraOtherInfos[otherinfoNo].oidval = -1; + xfree(extraOtherInfos[otherinfoNo].value); } } else { int i; - - for(i=0; i