X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=client%2Fclient.c;h=0d686ee0272b1e28542f870719213b31ab13f5f8;hp=97d8e4c6b142b4536950502b9adbd668cb82376c;hb=473f3071b86a40479e38e3fe4d434c0d2bf03379;hpb=b7579b51680366f1f2be83185faf1730d49859da diff --git a/client/client.c b/client/client.c index 97d8e4c..0d686ee 100644 --- a/client/client.c +++ b/client/client.c @@ -44,7 +44,7 @@ #endif #include - +#include #include #include @@ -127,6 +127,7 @@ static char ccl_fields[512] = "default.bib"; static char cql_fields[512] = "/usr/local/share/yaz/etc/pqf.properties"; static char *esPackageName = 0; static char *yazProxy = 0; +static int proxy_mode = 0; static int kilobytes = 64 * 1024; static char *negotiationCharset = 0; static int negotiationCharsetRecords = 1; @@ -146,7 +147,7 @@ static int z3950_version = 3; static int scan_stepSize = 0; static char scan_position[64]; static int scan_size = 20; -static char cur_host[200]; +static WRBUF cur_host = 0; static Odr_int last_hit_count = 0; static int pretty_xml = 0; static Odr_int sru_maximumRecords = 0; @@ -349,7 +350,7 @@ static void send_Z3950_initRequest(const char* type_and_host) req->referenceId = set_refid(out); - if (yazProxy && type_and_host) + if (proxy_mode && type_and_host) { yaz_oi_set_string_oid(&req->otherInfo, out, yaz_oid_userinfo_proxy, 1, type_and_host); @@ -545,7 +546,7 @@ static void render_diag(Z_DiagnosticFormat *diag) Z_DefaultDiagFormat *dd = ds->u.defaultDiagRec; /* ### should check `dd->diagnosticSetId' */ printf("code=" ODR_INT_PRINTF " (%s)", *dd->condition, - diagbib1_str(*dd->condition)); + diagbib1_str((int) *dd->condition)); /* Both types of addinfo are the same, so use type-pun */ if (dd->u.v2Addinfo != 0) printf(",\n\taddinfo='%s'", dd->u.v2Addinfo); @@ -703,7 +704,7 @@ static int session_connect_base(const char *arg, const char **basep) strncpy(type_and_host, arg, sizeof(type_and_host)-1); type_and_host[sizeof(type_and_host)-1] = '\0'; - conn = cs_create_host_proxy(arg, 1, &add, yazProxy); + conn = cs_create_host2(arg, 1, &add, yazProxy, &proxy_mode); if (!conn) { printf("Could not resolve address %s\n", arg); @@ -739,7 +740,7 @@ static int session_connect_base(const char *arg, const char **basep) return 0; } -static int session_connect(const char *arg) +static int session_connect(void) { int r; const char *basep = 0; @@ -747,7 +748,7 @@ static int session_connect(const char *arg) yaz_cookies_destroy(yaz_cookies); yaz_cookies = yaz_cookies_create(); - r = session_connect_base(arg, &basep); + r = session_connect_base(wrbuf_cstr(cur_host), &basep); if (basep && *basep) set_base(basep); else if (protocol == PROTO_Z3950) @@ -760,15 +761,16 @@ static int cmd_open(const char *arg) int r; if (arg) { - strncpy(cur_host, arg, sizeof(cur_host)-1); - cur_host[sizeof(cur_host)-1] = 0; + wrbuf_rewind(cur_host); + if (!strstr(arg, "://") && strcmp(sru_method, "soap")) + wrbuf_puts(cur_host, "http://"); + wrbuf_puts(cur_host, arg); } set_base(""); - r = session_connect(cur_host); + r = session_connect(); if (conn && conn->protocol == PROTO_HTTP) queryType = QueryType_CQL; - return r; } @@ -1202,7 +1204,7 @@ static void display_diagrecs(Z_DiagRec **pp, int num) printf("Unknown diagset: %s\n", diag_name); } printf(" [" ODR_INT_PRINTF "] %s", - *r->condition, diagbib1_str(*r->condition)); + *r->condition, diagbib1_str((int) *r->condition)); switch (r->which) { case Z_DefaultDiagFormat_v2Addinfo: @@ -1319,7 +1321,7 @@ static int send_srw_host_path(Z_SRW_PDU *sr, const char *host_port, const char *charset = negotiationCharset; Z_GDU *gdu; - gdu = z_get_HTTP_Request_host_path(out, host_port, path); + gdu = z_get_HTTP_Request_uri(out, host_port, path, proxy_mode); if (auth) { @@ -1362,8 +1364,7 @@ static int send_srw_host_path(Z_SRW_PDU *sr, const char *host_port, static int send_srw(Z_SRW_PDU *sr) { - char *path = yaz_encode_sru_dbpath_odr(out, databaseNames[0]); - return send_srw_host_path(sr, cur_host, path); + return send_srw_host_path(sr, wrbuf_cstr(cur_host), databaseNames[0]); } static int send_SRW_redirect(const char *uri) @@ -2387,7 +2388,7 @@ static int send_SRW_update(int action_no, const char *recid, char *rec_buf, int rec_len) { if (!conn) - session_connect(cur_host); + session_connect(); if (!conn) return 0; else @@ -2649,7 +2650,7 @@ static int cmd_explain(const char *arg) return 0; #if YAZ_HAVE_XML2 if (!conn) - session_connect(cur_host); + session_connect(); if (conn) { Z_SRW_PDU *sr = 0; @@ -2672,12 +2673,14 @@ static int cmd_init(const char *arg) { if (*arg) { - strncpy(cur_host, arg, sizeof(cur_host)-1); - cur_host[sizeof(cur_host)-1] = 0; + wrbuf_rewind(cur_host); + if (!strstr(arg, "://") && strcmp(sru_method, "soap")) + wrbuf_puts(cur_host, "http://"); + wrbuf_puts(cur_host, arg); } if (only_z3950()) return 1; - send_Z3950_initRequest(cur_host); + send_Z3950_initRequest(wrbuf_cstr(cur_host)); return 2; } @@ -2848,7 +2851,7 @@ static int cmd_find(const char *arg) { #if YAZ_HAVE_XML2 if (!conn) - session_connect(cur_host); + session_connect(); if (!conn) return 0; if (!send_SRW_searchRequest(arg)) @@ -2859,7 +2862,7 @@ static int cmd_find(const char *arg) } else { - if (*cur_host && auto_reconnect) + if (wrbuf_len(cur_host) && auto_reconnect) { int i = 0; for (;;) @@ -2877,7 +2880,7 @@ static int cmd_find(const char *arg) printf("Unable to reconnect\n"); break; } - session_connect(cur_host); + session_connect(); wait_and_handle_response(0); } return 0; @@ -3220,7 +3223,7 @@ static int cmd_show(const char *arg) { #if YAZ_HAVE_XML2 if (!conn) - session_connect(cur_host); + session_connect(); if (!conn) return 0; if (!send_SRW_presentRequest(arg)) @@ -3244,10 +3247,15 @@ static int cmd_show(const char *arg) static void exit_client(int code) { + odr_destroy(in); + odr_destroy(out); + odr_destroy(print); + ccl_qual_rm(&bibset); yaz_cookies_destroy(yaz_cookies); file_history_save(file_history); file_history_destroy(&file_history); nmem_destroy(nmem_auth); + wrbuf_destroy(cur_host); exit(code); } @@ -3470,7 +3478,7 @@ static void process_Z3950_scanResponse(Z_ScanResponse *res) num_entries = res->entries->num_entries; for (i = 0; i < num_entries; i++) { - int pos_term = res->positionOfTerm ? *res->positionOfTerm : -1; + Odr_int pos_term = res->positionOfTerm ? *res->positionOfTerm : -1; if (entries[i]->which == Z_Entry_termInfo) { printf("%c ", i + 1 == pos_term ? '*' : ' '); @@ -3609,7 +3617,7 @@ static int cmd_scan_common(const char *set, const char *arg) { #if YAZ_HAVE_XML2 if (!conn) - session_connect(cur_host); + session_connect(); if (!conn) return 0; if (send_SRW_scanRequest(scan_query, pos_p, scan_size) < 0) @@ -3621,9 +3629,9 @@ static int cmd_scan_common(const char *set, const char *arg) } else { - if (*cur_host && !conn && auto_reconnect) + if (wrbuf_len(cur_host) && !conn && auto_reconnect) { - session_connect(cur_host); + session_connect(); wait_and_handle_response(0); } if (!conn) @@ -3712,18 +3720,19 @@ static int cmd_format(const char *arg) static int cmd_elements(const char *arg) { - static Z_ElementSetNames esn; - static char what[100]; - - if (!arg || !*arg) + if (elementSetNames) { - elementSetNames = 0; - return 1; + xfree(elementSetNames->u.generic); + xfree(elementSetNames); + } + elementSetNames = 0; + if (arg && *arg) + { + elementSetNames = (Z_ElementSetNames *) + xmalloc(sizeof(*elementSetNames)); + elementSetNames->which = Z_ElementSetNames_generic; + elementSetNames->u.generic = xstrdup(arg); } - strcpy(what, arg); - esn.which = Z_ElementSetNames_generic; - esn.u.generic = what; - elementSetNames = &esn; return 1; } @@ -4254,6 +4263,8 @@ static void initialize(const char *rc_file) FILE *inf; int i; + cur_host = wrbuf_alloc(); + if (!(out = odr_createmem(ODR_ENCODE)) || !(in = odr_createmem(ODR_DECODE)) || !(print = odr_createmem(ODR_PRINT))) @@ -4527,39 +4538,37 @@ static void wait_and_handle_response(int one_response_only) while(conn) { res = cs_get(conn, &netbuffer, &netbufferlen); - if (reconnect_ok && res <= 0 && protocol == PROTO_HTTP) + if (res <= 0) { - cs_close(conn); - conn = 0; - session_connect(cur_host); - reconnect_ok = 0; - if (conn) + if (reconnect_ok && protocol == PROTO_HTTP) { - char *buf_out; - int len_out; - - buf_out = odr_getbuf(out, &len_out, 0); - - do_hex_dump(buf_out, len_out); - - cs_put(conn, buf_out, len_out); - - odr_reset(out); - continue; + cs_close(conn); + conn = 0; + session_connect(); + reconnect_ok = 0; + if (conn) + { + char *buf_out; + int len_out; + buf_out = odr_getbuf(out, &len_out, 0); + do_hex_dump(buf_out, len_out); + cs_put(conn, buf_out, len_out); + odr_reset(out); + continue; + } + } + else + { + printf("Target closed connection\n"); + close_session(); + break; } - } - else if (res <= 0) - { - printf("Target closed connection\n"); - close_session(); - break; } #if HAVE_GETTIMEOFDAY if (got_tv_end == 0) gettimeofday(&tv_end, 0); /* count first one only */ got_tv_end++; #endif - odr_reset(out); odr_reset(in); /* release APDU from last round */ record_last = 0; do_hex_dump(netbuffer, res); @@ -4567,21 +4576,43 @@ static void wait_and_handle_response(int one_response_only) if (!z_GDU(in, &gdu, 0, 0)) { - FILE *f = ber_file ? ber_file : stdout; - odr_perror(in, "Decoding incoming APDU"); - fprintf(f, "[Near %ld]\n", (long) odr_offset(in)); - fprintf(f, "Packet dump:\n---------\n"); - odr_dumpBER(f, netbuffer, res); - fprintf(f, "---------\n"); - if (apdu_file) + if (reconnect_ok && protocol == PROTO_HTTP) { - z_GDU(print, &gdu, 0, 0); - odr_reset(print); + fprintf(stderr, "Decoding error. Reconnecting\n"); + cs_close(conn); + conn = 0; + session_connect(); + reconnect_ok = 0; + if (conn) + { + char *buf_out; + int len_out; + buf_out = odr_getbuf(out, &len_out, 0); + do_hex_dump(buf_out, len_out); + cs_put(conn, buf_out, len_out); + odr_reset(out); + continue; + } + } + else + { + FILE *f = ber_file ? ber_file : stdout; + odr_perror(in, "Decoding incoming APDU"); + fprintf(f, "[Near %ld]\n", (long) odr_offset(in)); + fprintf(f, "Packet dump:\n---------\n"); + odr_dumpBER(f, netbuffer, res); + fprintf(f, "---------\n"); + if (apdu_file) + { + z_GDU(print, &gdu, 0, 0); + odr_reset(print); + } + if (conn && cs_more(conn)) + continue; + break; } - if (conn && cs_more(conn)) - continue; - break; } + odr_reset(out); if (ber_file) odr_dumpBER(ber_file, netbuffer, res); if (apdu_file && !z_GDU(print, &gdu, 0, 0)) @@ -4655,7 +4686,7 @@ static void wait_and_handle_response(int one_response_only) { const char *base_tmp; int host_change = 0; - location = yaz_check_location(in, cur_host, + location = yaz_check_location(in, wrbuf_cstr(cur_host), location, &host_change); if (host_change) session_connect_base(location, &base_tmp); @@ -4836,9 +4867,9 @@ static int cmd_list_all(const char* args) /* connection options */ if (conn) - printf("Connected to : %s\n", cur_host); - else if (*cur_host) - printf("Not connected to : %s\n", cur_host); + printf("Connected to : %s\n", wrbuf_cstr(cur_host)); + else if (cur_host && wrbuf_len(cur_host)) + printf("Not connected to : %s\n", wrbuf_cstr(cur_host)); else printf("Not connected : \n"); if (yazProxy) printf("using proxy : %s\n",yazProxy); @@ -5153,27 +5184,31 @@ static int cmd_register_tab(const char* arg) static void process_cmd_line(char* line) { int i, res; - char word[32], arg[10240]; + char word[32], *arg; + int no_read = 0; #if HAVE_GETTIMEOFDAY gettimeofday(&tv_start, 0); #endif - if ((res = sscanf(line, "%31s %10239[^;]", word, arg)) <= 0) + sscanf(line, "%31s%n", word, &no_read); + if (no_read == 0) { strcpy(word, last_cmd); - *arg = '\0'; + arg = line + strlen(line); } - else if (res == 1) - *arg = 0; + else + arg = line + no_read; strcpy(last_cmd, word); - /* removed tailing spaces from the arg command */ + /* whitespace chop */ { - char* p = arg; - char* lastnonspace=NULL; + char *p; + char *lastnonspace = 0; - for (; *p; ++p) + while (*arg && yaz_isspace(*arg)) + arg++; + for (p = arg; *p; ++p) { if (!yaz_isspace(*p)) lastnonspace = p; @@ -5257,9 +5292,9 @@ static char **readline_completer(char *text, int start, int end) } else { - char arg[10240],word[32]; - int i ,res; - if ((res = sscanf(rl_line_buffer, "%31s %10239[^;]", word, arg)) <= 0) + char word[32]; + int i; + if (sscanf(rl_line_buffer, "%31s", word) <= 0) { rl_attempted_completion_over = 1; return NULL; @@ -5391,6 +5426,8 @@ int main(int argc, char **argv) if (codeset) outputCharset = xstrdup(codeset); + yaz_enable_panic_backtrace(prog); + ODR_MASK_SET(&z3950_options, Z_Options_search); ODR_MASK_SET(&z3950_options, Z_Options_present); ODR_MASK_SET(&z3950_options, Z_Options_namedResultSets);