X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=client%2Fclient.c;h=0d686ee0272b1e28542f870719213b31ab13f5f8;hp=31fd6f8f8321b0ea4ff2c04588e73b0e733ae1bb;hb=473f3071b86a40479e38e3fe4d434c0d2bf03379;hpb=8fb781d91bd3f8bd73dc30b4a1bdc23a69120d87 diff --git a/client/client.c b/client/client.c index 31fd6f8..0d686ee 100644 --- a/client/client.c +++ b/client/client.c @@ -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; @@ -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); @@ -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); @@ -1320,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_uri(out, host_port, path, yazProxy ? 1 : 0); + gdu = z_get_HTTP_Request_uri(out, host_port, path, proxy_mode); if (auth) { @@ -3719,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; } @@ -4536,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(); - 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); @@ -4576,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)) @@ -5162,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; @@ -5266,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;