X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=client%2Fclient.c;h=f528d96b4781a881bda7be5f7dbcbac350fe1716;hb=72942b6650af98632103a0908882b71c4113e153;hp=93741ca9c48bf4f2cc9ee9aed6dfc6d32a469851;hpb=442f9815fa99344367af117cba29f2c0e209a0cf;p=yaz-moved-to-github.git diff --git a/client/client.c b/client/client.c index 93741ca..f528d96 100644 --- a/client/client.c +++ b/client/client.c @@ -92,7 +92,10 @@ static Z_SRW_PDU *srw_sr = 0; 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 */ +static NMEM nmem_auth = NULL; + char *databaseNames[128]; int num_databaseNames = 0; static Z_External *record_last = 0; @@ -130,7 +133,6 @@ static char* yazLang = 0; static char last_cmd[32] = "?"; static FILE *marc_file = 0; static char *refid = NULL; -static char *last_open_command = NULL; static int auto_reconnect = 0; static int auto_wait = 1; static Odr_bitmask z3950_options; @@ -179,6 +181,8 @@ static void close_session(void); static void marc_file_write(const char *buf, size_t sz); +static void wait_and_handle_response(int one_response_only); + ODR getODROutputStream(void) { return out; @@ -661,15 +665,6 @@ static int cmd_base(const char *arg) return set_base(arg); } -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); - } -} - int session_connect(const char *arg) { void *add; @@ -691,8 +686,6 @@ int session_connect(const char *arg) strncpy(type_and_host, arg, sizeof(type_and_host)-1); type_and_host[sizeof(type_and_host)-1] = '\0'; - cmd_open_remember_last_open_command(arg, type_and_host); - if (yazProxy) conn = cs_create_host(yazProxy, 1, &add); else @@ -752,74 +745,63 @@ int cmd_open(const char *arg) return r; } -void try_reconnect(void) -{ - char* open_command; - - if(!( auto_reconnect && last_open_command) ) return ; - - open_command = (char *) xmalloc(strlen(last_open_command)+6); - strcpy(open_command, "open "); - - strcat(open_command, last_open_command); - - process_cmd_line(open_command); - - xfree(open_command); -} - int cmd_authentication(const char *arg) { - static Z_IdAuthentication au; - static char user[40], group[40], pass[40]; - static Z_IdPass idPass; + char **args; int r; - if (!*arg) - { - printf("Auth field set to null\n"); - auth = 0; - return 1; - } - r = sscanf(arg, "%39s %39s %39s", user, group, pass); + nmem_reset(nmem_auth); + nmem_strsplit_blank(nmem_auth, arg, &args, &r); + if (r == 0) { printf("Authentication set to null\n"); auth = 0; } - if (r == 1) + else if (r == 1) { - auth = &au; - if (!strcmp(user, "-")) { - au.which = Z_IdAuthentication_anonymous; + auth = nmem_malloc(nmem_auth, sizeof(*auth)); + if (!strcmp(args[0], "-")) + { + auth->which = Z_IdAuthentication_anonymous; + auth->u.anonymous = odr_nullval(); printf("Authentication set to Anonymous\n"); - } else { - au.which = Z_IdAuthentication_open; - au.u.open = user; - printf("Authentication set to Open (%s)\n", user); + } + else + { + auth->which = Z_IdAuthentication_open; + auth->u.open = args[0]; + printf("Authentication set to Open (%s)\n", args[0]); } } - if (r == 2) - { - auth = &au; - au.which = Z_IdAuthentication_idPass; - au.u.idPass = &idPass; - idPass.groupId = NULL; - idPass.userId = !strcmp(user, "-") ? 0 : user; - idPass.password = !strcmp(group, "-") ? 0 : group; - printf("Authentication set to User (%s), Pass (%s)\n", user, group); + else if (r == 2) + { + auth = nmem_malloc(nmem_auth, sizeof(*auth)); + auth->which = Z_IdAuthentication_idPass; + auth->u.idPass = nmem_malloc(nmem_auth, sizeof(*auth->u.idPass)); + auth->u.idPass->groupId = NULL; + auth->u.idPass->userId = !strcmp(args[0], "-") ? 0 : args[0]; + auth->u.idPass->password = !strcmp(args[1], "-") ? 0 : args[1]; + printf("Authentication set to User (%s), Pass (%s)\n", + args[0], args[1]); + } + else if (r == 3) + { + auth = nmem_malloc(nmem_auth, sizeof(*auth)); + auth->which = Z_IdAuthentication_idPass; + auth->u.idPass = nmem_malloc(nmem_auth, sizeof(*auth->u.idPass)); + auth->u.idPass->groupId = args[1]; + auth->u.idPass->userId = args[0]; + auth->u.idPass->password = args[2]; + printf("Authentication set to User (%s), Group (%s), Pass (%s)\n", + args[0], args[1], args[2]); } - if (r == 3) + else { - auth = &au; - au.which = Z_IdAuthentication_idPass; - au.u.idPass = &idPass; - idPass.groupId = group; - idPass.userId = user; - idPass.password = pass; - printf("Authentication set to User (%s), Group (%s), Pass (%s)\n", - user, group, pass); + printf("Bad number of args to auth\n"); + auth = 0; } + return 1; } @@ -2575,17 +2557,39 @@ static int cmd_find(const char *arg) } else { - if (!conn) + if (*cur_host && auto_reconnect) { - try_reconnect(); - - if (!conn) { - printf("Not connected yet\n"); - return 0; + int i = 0; + for (;;) + { + if (conn) + { + if (!send_searchRequest(arg)) + return 0; + wait_and_handle_response(0); + if (conn) + break; + } + if (++i == 2) + { + printf("Unable to reconnect\n"); + break; + } + session_connect(cur_host); + wait_and_handle_response(0); } + return 0; + } + else if (conn) + { + if (!send_searchRequest(arg)) + return 0; } - if (!send_searchRequest(arg)) + else + { + printf("Not connected yet\n"); return 0; + } } return 2; } @@ -2867,6 +2871,7 @@ void exit_client(int code) { file_history_save(file_history); file_history_destroy(&file_history); + nmem_destroy(nmem_auth); exit(code); } @@ -3208,15 +3213,13 @@ static int cmd_scan_common(const char *set, const char *arg) } else { - if (!conn) + if (*cur_host && !conn && auto_reconnect) { - try_reconnect(); - - if (!conn) { - printf("Session not initialized yet\n"); - return 0; - } + session_connect(cur_host); + wait_and_handle_response(0); } + if (!conn) + return 0; if (session_initResponse && !ODR_MASK_GET(session_initResponse->options, Z_Options_scan)) { @@ -3911,11 +3914,6 @@ static void handle_srw_record(Z_SRW_record *rec) printf("\n"); if (rec->recordData_buf && rec->recordData_len) { - if (fwrite(rec->recordData_buf, 1, rec->recordData_len, stdout) != - (size_t) (rec->recordData_len)) - { - printf("write to stdout failed\n"); - } printf("%.*s", rec->recordData_len, rec->recordData_buf); marc_file_write(rec->recordData_buf, rec->recordData_len); } @@ -4078,7 +4076,7 @@ static void http_response(Z_HTTP_Response *hres) } #endif -void wait_and_handle_response(int one_response_only) +static void wait_and_handle_response(int one_response_only) { int reconnect_ok = 1; int res; @@ -4374,16 +4372,13 @@ int cmd_list_all(const char* args) { int i; /* connection options */ - if(conn) { - printf("Connected to : %s\n",last_open_command); - } else { - if(last_open_command) - printf("Not connected to : %s\n",last_open_command); - else - printf("Not connected : \n"); - - } - if(yazProxy) printf("using proxy : %s\n",yazProxy); + if (conn) + printf("Connected to : %s\n", cur_host); + else if (*cur_host) + printf("Not connected to : %s\n", cur_host); + else + printf("Not connected : \n"); + if (yazProxy) printf("using proxy : %s\n",yazProxy); printf("auto_reconnect : %s\n",auto_reconnect?"on":"off"); printf("auto_wait : %s\n",auto_wait?"on":"off"); @@ -4922,6 +4917,8 @@ int main(int argc, char **argv) ODR_MASK_SET(&z3950_options, Z_Options_extendedServices); ODR_MASK_SET(&z3950_options, Z_Options_delSet); + nmem_auth = nmem_create(); + while ((ret = options("k:c:q:a:b:m:v:p:u:t:Vxd:f:", argv, argc, &arg)) != -2) { switch (ret)