X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=client%2Fclient.c;h=be428245c9715524e1f518e441dc20df4a93f06a;hp=d0f9ad545ae0ba84894f9ae1038d3d6322814b9d;hb=3b96525a40981e162b959f3e842e0ff20e314320;hpb=a6866a0c08c5b0b853d2385ec2f28a0832cc3241 diff --git a/client/client.c b/client/client.c index d0f9ad5..be42824 100644 --- a/client/client.c +++ b/client/client.c @@ -2,7 +2,7 @@ * Copyright (c) 1995-2004, Index Data * See the file LICENSE for details. * - * $Id: client.c,v 1.238 2004-04-07 13:51:50 adam Exp $ + * $Id: client.c,v 1.256 2004-11-18 15:18:10 heikki Exp $ */ #include @@ -16,6 +16,15 @@ #include #endif +#if HAVE_OPENSSL_SSL_H +#include +#include +#include +#include +#include +#include +#endif + #include #include @@ -42,6 +51,7 @@ #include #include #include +#include #if HAVE_READLINE_READLINE_H #include @@ -106,7 +116,8 @@ static char *last_open_command = NULL; static int auto_reconnect = 0; static Odr_bitmask z3950_options; static int z3950_version = 3; - +static int scan_stepSize = 0; +static int scan_position = 1; static char cur_host[200]; typedef enum { @@ -370,9 +381,25 @@ static int process_initResponse(Z_InitResponse *res) printf("Guessing visiblestring:\n"); printf("'%s'\n", uif->u. octet_aligned->buf); } else if (uif->which == Z_External_single) { - /* Peek at any private Init-diagnostic APDUs */ Odr_any *sat = uif->u.single_ASN1_type; - printf("### NAUGHTY: External is '%s'\n", sat->buf); + oident *oid = oid_getentbyoid(uif->direct_reference); + if (oid->value == VAL_OCLCUI) { + Z_OCLC_UserInformation *oclc_ui; + ODR decode = odr_createmem(ODR_DECODE); + odr_setbuf(decode, sat->buf, sat->len, 0); + if (!z_OCLC_UserInformation(decode, &oclc_ui, 0, 0)) + printf ("Bad OCLC UserInformation:\n"); + else + printf ("OCLC UserInformation:\n"); + if (!z_OCLC_UserInformation(print, &oclc_ui, 0, 0)) + printf ("Bad OCLC UserInformation spec\n"); + odr_destroy(decode); + } + else + { + /* Peek at any private Init-diagnostic APDUs */ + printf("### NAUGHTY: External is '%.*s'\n", sat->len, sat->buf); + } } odr_reset (print); } @@ -529,6 +556,9 @@ int session_connect(const char *arg) void *add; char type_and_host[101]; const char *basep = 0; +#if HAVE_OPENSSL_SSL_H + SSL *ssl; +#endif if (conn) { cs_close (conn); @@ -556,6 +586,8 @@ int session_connect(const char *arg) return 0; } #if HAVE_XML2 + if (conn->protocol == PROTO_HTTP) + queryType = QueryType_CQL; #else if (conn->protocol == PROTO_HTTP) { @@ -586,6 +618,30 @@ int session_connect(const char *arg) return 0; } printf("OK.\n"); +#if HAVE_OPENSSL_SSL_H + if ((ssl = (SSL *) cs_get_ssl(conn))) + { + X509 *server_cert = SSL_get_peer_certificate (ssl); + + if (server_cert) + { + char *pem_buf; + int pem_len; + BIO *bio = BIO_new(BIO_s_mem()); + + /* get PEM buffer in memory */ + PEM_write_bio_X509(bio, server_cert); + pem_len = BIO_get_mem_data(bio, &pem_buf); + fwrite(pem_buf, pem_len, 1, stdout); + + /* print all info on screen .. */ + X509_print_fp(stdout, server_cert); + BIO_free(bio); + + X509_free (server_cert); + } + } +#endif if (basep && *basep) set_base (basep); if (protocol == PROTO_Z3950) @@ -687,6 +743,8 @@ static void print_record(const unsigned char *buf, size_t len) /* add newline if not already added ... */ if (i <= 0 || buf[i-1] != '\n') printf ("\n"); + if (marc_file) + fwrite (buf, 1, len, marc_file); } static void display_record(Z_External *r) @@ -1074,7 +1132,7 @@ static int send_deleteResultSetRequest(const char *arg) odr_malloc (out, sizeof(*req->deleteFunction)); if (req->num_resultSetList > 0) { - *req->deleteFunction = Z_DeleteRequest_list; + *req->deleteFunction = Z_DeleteResultSetRequest_list; req->resultSetList = (char **) odr_malloc (out, sizeof(*req->resultSetList)* req->num_resultSetList); @@ -1083,7 +1141,7 @@ static int send_deleteResultSetRequest(const char *arg) } else { - *req->deleteFunction = Z_DeleteRequest_all; + *req->deleteFunction = Z_DeleteResultSetRequest_all; req->resultSetList = 0; } @@ -1205,14 +1263,31 @@ static int send_SRW_searchRequest(const char *arg) setno = 1; /* save this for later .. when fetching individual records */ - srw_sr = sr = yaz_srw_get(srw_sr_odr_out, Z_SRW_searchRetrieve_request); - sr->u.request->query_type = Z_SRW_query_type_cql; - sr->u.request->query.cql = odr_strdup(srw_sr_odr_out, arg); - + srw_sr = yaz_srw_get(srw_sr_odr_out, Z_SRW_searchRetrieve_request); + + /* regular request .. */ sr = yaz_srw_get(out, Z_SRW_searchRetrieve_request); - sr->u.request->query_type = Z_SRW_query_type_cql; - sr->u.request->query.cql = odr_strdup(out, arg); + switch(queryType) + { + case QueryType_CQL: + srw_sr->u.request->query_type = Z_SRW_query_type_cql; + srw_sr->u.request->query.cql = odr_strdup(srw_sr_odr_out, arg); + + sr->u.request->query_type = Z_SRW_query_type_cql; + sr->u.request->query.cql = odr_strdup(out, arg); + break; + case QueryType_Prefix: + srw_sr->u.request->query_type = Z_SRW_query_type_pqf; + srw_sr->u.request->query.pqf = odr_strdup(srw_sr_odr_out, arg); + + sr->u.request->query_type = Z_SRW_query_type_pqf; + sr->u.request->query.pqf = odr_strdup(out, arg); + break; + default: + printf ("Only CQL and PQF supported in SRW\n"); + return 0; + } sr->u.request->maximumRecords = odr_intdup(out, 0); if (record_schema) @@ -1228,7 +1303,6 @@ static int send_searchRequest(const char *arg) Z_APDU *apdu = zget_APDU(out, Z_APDU_searchRequest); Z_SearchRequest *req = apdu->u.searchRequest; Z_Query query; - int oid[OID_SIZE]; struct ccl_rpn_node *rpn = NULL; int error, pos; char setstring[100]; @@ -1297,13 +1371,9 @@ static int send_searchRequest(const char *arg) if (smallSetUpperBound > 0 || (largeSetLowerBound > 1 && mediumSetPresentNumber > 0)) { - oident prefsyn; - - prefsyn.proto = protocol; - prefsyn.oclass = CLASS_RECSYN; - prefsyn.value = recordsyntax; req->preferredRecordSyntax = - odr_oiddup(out, oid_ent_to_oid(&prefsyn, oid)); + yaz_oidval_to_z3950oid(out, CLASS_RECSYN, recordsyntax); + req->smallSetElementSetNames = req->mediumSetElementSetNames = elementSetNames; } @@ -1927,8 +1997,6 @@ static int cmd_update_common(const char *arg, int version) Z_APDU *apdu = zget_APDU(out, Z_APDU_extendedServicesRequest ); Z_ExtendedServicesRequest *req = apdu->u.extendedServicesRequest; Z_External *r; - int oid[OID_SIZE]; - oident update_oid; char action[20], recid[20], fname[80]; int action_no; Z_External *record_this = 0; @@ -1989,21 +2057,17 @@ static int cmd_update_common(const char *arg, int version) record_this = record_last; } - update_oid.proto = PROTO_Z3950; - update_oid.oclass = CLASS_EXTSERV; - if (version == 0) - update_oid.value = VAL_DBUPDATE0; - else - update_oid.value = VAL_DBUPDATE; - oid_ent_to_oid (&update_oid, oid); - req->packageType = odr_oiddup(out,oid); + req->packageType = + yaz_oidval_to_z3950oid(out, CLASS_EXTSERV, + version == 0 ? VAL_DBUPDATE0 : VAL_DBUPDATE); + req->packageName = esPackageName; req->referenceId = set_refid (out); r = req->taskSpecificParameters = (Z_External *) odr_malloc (out, sizeof(*r)); - r->direct_reference = odr_oiddup(out,oid); + r->direct_reference = req->packageType; r->indirect_reference = 0; r->descriptor = 0; if (version == 0) @@ -2307,9 +2371,7 @@ static int send_presentRequest(const char *arg) Z_APDU *apdu = zget_APDU(out, Z_APDU_presentRequest); Z_PresentRequest *req = apdu->u.presentRequest; Z_RecordComposition compo; - oident prefsyn; int nos = 1; - int oid[OID_SIZE]; char setstring[100]; req->referenceId = set_refid (out); @@ -2320,20 +2382,12 @@ static int send_presentRequest(const char *arg) req->resultSetStartPoint = &setno; req->numberOfRecordsRequested = &nos; - prefsyn.proto = protocol; - prefsyn.oclass = CLASS_RECSYN; - prefsyn.value = recordsyntax; + req->preferredRecordSyntax = - odr_oiddup (out, oid_ent_to_oid(&prefsyn, oid)); + yaz_oidval_to_z3950oid(out, CLASS_RECSYN, recordsyntax); if (record_schema) { - oident prefschema; - - prefschema.proto = protocol; - prefschema.oclass = CLASS_SCHEMA; - prefschema.value = oid_getvalbyname(record_schema); - req->recordComposition = &compo; compo.which = Z_RecordComp_complex; compo.u.complex = (Z_CompSpec *) @@ -2345,14 +2399,15 @@ static int send_presentRequest(const char *arg) compo.u.complex->generic = (Z_Specification *) odr_malloc(out, sizeof(*compo.u.complex->generic)); compo.u.complex->generic->which = Z_Schema_oid; - compo.u.complex->generic->schema.oid = (Odr_oid *) - odr_oiddup(out, oid_ent_to_oid(&prefschema, oid)); + + compo.u.complex->generic->schema.oid = + yaz_str_to_z3950oid(out, CLASS_SCHEMA, record_schema); + if (!compo.u.complex->generic->schema.oid) { /* OID wasn't a schema! Try record syntax instead. */ - prefschema.oclass = CLASS_RECSYN; compo.u.complex->generic->schema.oid = (Odr_oid *) - odr_oiddup(out, oid_ent_to_oid(&prefschema, oid)); + yaz_str_to_z3950oid(out, CLASS_RECSYN, record_schema); } if (!elementSetNames) compo.u.complex->generic->elementSpec = 0; @@ -2504,25 +2559,34 @@ int cmd_cancel(const char *arg) printf("Target doesn't support cancel (trigger resource ctrl)\n"); return 0; } - *req->requestedAction = Z_TriggerResourceCtrl_cancel; + *req->requestedAction = Z_TriggerResourceControlRequest_cancel; req->resultSetWanted = &rfalse; + req->referenceId = set_refid (out); send_apdu(apdu); printf("Sent cancel request\n"); return 2; } + +int cmd_cancel_find(const char *arg) { + int fres; + fres=cmd_find(arg); + if( fres > 0 ) { + return cmd_cancel(""); + }; + return fres; +} + int send_scanrequest(const char *query, int pp, int num, const char *term) { Z_APDU *apdu = zget_APDU(out, Z_APDU_scanRequest); Z_ScanRequest *req = apdu->u.scanRequest; - int oid[OID_SIZE]; if (only_z3950()) return 0; if (queryType == QueryType_CCL2RPN) { - oident bib1; int error, pos; struct ccl_rpn_node *rpn; @@ -2532,10 +2596,8 @@ int send_scanrequest(const char *query, int pp, int num, const char *term) printf("CCL ERROR: %s\n", ccl_err_msg(error)); return -1; } - bib1.proto = PROTO_Z3950; - bib1.oclass = CLASS_ATTSET; - bib1.value = VAL_BIB1; - req->attributeSet = oid_ent_to_oid (&bib1, oid); + req->attributeSet = + yaz_oidval_to_z3950oid(out, CLASS_ATTSET, VAL_BIB1); if (!(req->termListAndStartPoint = ccl_scan_query (out, rpn))) { printf("Couldn't convert CCL to Scan term\n"); @@ -2578,6 +2640,7 @@ int send_scanrequest(const char *query, int pp, int num, const char *term) req->databaseNames = databaseNames; req->numberOfTermsRequested = # req->preferredPositionInResponse = &pp; + req->stepSize = odr_intdup(out, scan_stepSize); send_apdu(apdu); return 2; } @@ -2676,11 +2739,11 @@ void process_sortResponse(Z_SortResponse *res) printf("Received SortResponse: status="); switch (*res->sortStatus) { - case Z_SortStatus_success: + case Z_SortResponse_success: printf ("success"); break; - case Z_SortStatus_partial_1: + case Z_SortResponse_partial_1: printf ("partial"); break; - case Z_SortStatus_failure: + case Z_SortResponse_failure: printf ("failure"); break; default: printf ("unknown (%d)", *res->sortStatus); @@ -2740,6 +2803,20 @@ int cmd_sort_newset (const char *arg) return cmd_sort_generic (arg, 1); } +int cmd_scanstep(const char *arg) +{ + scan_stepSize = atoi(arg); + return 0; +} + +int cmd_scanpos(const char *arg) +{ + int r = sscanf(arg, "%d", &scan_position); + if (r == 0) + scan_position = 1; + return 0; +} + int cmd_scan(const char *arg) { if (only_z3950()) @@ -2761,7 +2838,7 @@ int cmd_scan(const char *arg) if (*arg) { strcpy (last_scan_query, arg); - if (send_scanrequest(arg, 1, 20, 0) < 0) + if (send_scanrequest(arg, scan_position, 20, 0) < 0) return 0; } else @@ -2864,10 +2941,7 @@ int cmd_refid (const char *arg) xfree (refid); refid = NULL; if (*arg) - { - refid = (char *) xmalloc (strlen(arg)+1); - strcpy (refid, arg); - } + refid = xstrdup (arg); return 1; } @@ -2977,10 +3051,7 @@ int cmd_lang(const char* arg) xfree (yazLang); yazLang = NULL; if (*arg) - { - yazLang = (char *) xmalloc (strlen(arg)+1); - strcpy (yazLang, arg); - } + yazLang = xstrdup(arg); return 1; } @@ -2988,7 +3059,7 @@ int cmd_source(const char* arg) { /* first should open the file and read one line at a time.. */ FILE* includeFile; - char line[1024], *cp; + char line[102400], *cp; if(strlen(arg)<1) { fprintf(stderr,"Error in source command use a filename\n"); @@ -3172,7 +3243,7 @@ int cmd_register_oid(const char* args) { if (sscanf (args, "%100[^ ] %100[^ ] %100s", oname_str,oclass_str, oid_str) < 1) { - printf("Error in regristrate command \n"); + printf("Error in register command \n"); return 0; } @@ -3185,7 +3256,7 @@ int cmd_register_oid(const char* args) { } if(!(oid_classes[i].className)) { - printf("Unknonwn oid class %s\n",oclass_str); + printf("Unknown oid class %s\n",oclass_str); return 0; } @@ -3193,7 +3264,7 @@ int cmd_register_oid(const char* args) { name = oid_str; val = 0; - while (isdigit (*name)) + while (isdigit (*(unsigned char *) name)) { val = val*10 + (*name - '0'); name++; @@ -3208,9 +3279,11 @@ int cmd_register_oid(const char* args) { oid[i] = val; oid[i+1] = -1; - new_oident=oid_addent (oid,PROTO_GENERAL,oidclass,oname_str,VAL_DYNAMIC); - if(strcmp(new_oident->desc,oname_str)) { - fprintf(stderr,"oid is already named as %s, regristration faild\n", + new_oident = oid_addent (oid, PROTO_GENERAL, oidclass, oname_str, + VAL_DYNAMIC); + if(strcmp(new_oident->desc,oname_str)) + { + fprintf(stderr,"oid is already named as %s, registration failed\n", new_oident->desc); } return 1; @@ -3306,7 +3379,11 @@ static void handle_srw_record(Z_SRW_record *rec) printf (" schema=%s", rec->recordSchema); printf ("\n"); if (rec->recordData_buf && rec->recordData_len) + { fwrite(rec->recordData_buf, 1, rec->recordData_len, stdout); + if (marc_file) + fwrite (rec->recordData_buf, 1, rec->recordData_len, marc_file); + } else printf ("No data!"); printf("\n"); @@ -3595,19 +3672,21 @@ int cmd_cclparse(const char* arg) int cmd_set_otherinfo(const char* args) { - char oid[101], otherinfoString[101]; + char oidstr[101], otherinfoString[101]; int otherinfoNo; int sscan_res; int oidval; - sscan_res = sscanf (args, "%d %100[^ ] %100s", &otherinfoNo, oid, otherinfoString); - if(sscan_res==1) { + sscan_res = sscanf (args, "%d %100[^ ] %100s", &otherinfoNo, oidstr, otherinfoString); + if (sscan_res==1) { /* reset this otherinfo */ if(otherinfoNo>=maxOtherInfosSupported) { - printf("Error otherinfo index to large (%d>%d)\n",otherinfoNo,maxOtherInfosSupported); + printf("Error otherinfo index to large (%d>%d)\n", + otherinfoNo,maxOtherInfosSupported); } extraOtherInfos[otherinfoNo].oidval = -1; - if(extraOtherInfos[otherinfoNo].value) free(extraOtherInfos[otherinfoNo].value); + if (extraOtherInfos[otherinfoNo].value) + free(extraOtherInfos[otherinfoNo].value); return 0; } if (sscan_res<3) { @@ -3615,13 +3694,14 @@ int cmd_set_otherinfo(const char* args) return 0; } - if(otherinfoNo>=maxOtherInfosSupported) { - printf("Error otherinfo index to large (%d>%d)\n",otherinfoNo,maxOtherInfosSupported); + if (otherinfoNo>=maxOtherInfosSupported) { + printf("Error otherinfo index to large (%d>%d)\n", + otherinfoNo,maxOtherInfosSupported); } - oidval = oid_getvalbyname (oid); - if(oidval == -1 ) { - printf("Error in set_otherinfo command unknown oid %s \n",oid); + oidval = oid_getvalbyname (oidstr); + if (oidval == -1 ) { + printf("Error in set_otherinfo command unknown oid %s \n",oidstr); return 0; } extraOtherInfos[otherinfoNo].oidval = oidval; @@ -3631,6 +3711,20 @@ int cmd_set_otherinfo(const char* args) return 0; } +int cmd_sleep(const char* args ) +{ + int sec=atoi(args); + if( sec > 0 ) { +#ifdef WIN32 + Sleep(sec*1000); +#else + sleep(sec); +#endif + printf("Done sleeping %d seconds\n", sec); + } + return 1; +} + int cmd_list_otherinfo(const char* args) { int i; @@ -3782,6 +3876,8 @@ static struct { {"base", cmd_base, "",NULL,0,NULL}, {"show", cmd_show, "['+'<#recs>['+']]",NULL,0,NULL}, {"scan", cmd_scan, "",NULL,0,NULL}, + {"scanstep", cmd_scanstep, "",NULL,0,NULL}, + {"scanpos", cmd_scanpos, "",NULL,0,NULL}, {"sort", cmd_sort, " ...",NULL,0,NULL}, {"sort+", cmd_sort_newset, " ...",NULL,0,NULL}, {"authentication", cmd_authentication, "",NULL,0,NULL}, @@ -3791,6 +3887,7 @@ static struct { {"status", cmd_status, "",NULL,0,NULL}, {"setnames", cmd_setnames, "",NULL,0,NULL}, {"cancel", cmd_cancel, "",NULL,0,NULL}, + {"cancel_find", cmd_cancel_find, "",NULL,0,NULL}, {"format", cmd_format, "",complete_format,0,NULL}, {"schema", cmd_schema, "",complete_schema,0,NULL}, {"elements", cmd_elements, "",NULL,0,NULL}, @@ -3814,7 +3911,8 @@ static struct { {"set_cclfile", cmd_set_cclfile," ",NULL,1,NULL}, {"set_cqlfile", cmd_set_cqlfile," ",NULL,1,NULL}, {"set_auto_reconnect", cmd_set_auto_reconnect," on|off",complete_auto_reconnect,1,NULL}, - {"set_otherinfo", cmd_set_otherinfo," ",NULL,0,NULL}, + {"set_otherinfo", cmd_set_otherinfo," ",NULL,0,NULL}, + {"sleep", cmd_sleep,"",NULL,0,NULL}, {"register_oid", cmd_register_oid," ",NULL,0,NULL}, {"push_command", cmd_push_command,"",command_generator,0,NULL}, {"register_tab", cmd_register_tab," ",command_generator,0,NULL}, @@ -3926,13 +4024,13 @@ int cmd_register_tab(const char* arg) { void process_cmd_line(char* line) { int i,res; - char word[32], arg[1024]; + char word[32], arg[10240]; #if HAVE_GETTIMEOFDAY gettimeofday (&tv_start, 0); #endif - if ((res = sscanf(line, "%31s %1023[^;]", word, arg)) <= 0) + if ((res = sscanf(line, "%31s %10239[^;]", word, arg)) <= 0) { strcpy(word, last_cmd); *arg = '\0'; @@ -3947,7 +4045,7 @@ void process_cmd_line(char* line) char* lastnonspace=NULL; for(;*p; ++p) { - if(!isspace(*p)) { + if(!isspace(*(unsigned char *) p)) { lastnonspace = p; } } @@ -4017,9 +4115,9 @@ char ** readline_completer(char *text, int start, int end) { rl_attempted_completion_over = 1; return res; } else { - char arg[1024],word[32]; + char arg[10240],word[32]; int i=0 ,res; - if ((res = sscanf(rl_line_buffer, "%31s %1023[^;]", word, arg)) <= 0) { + if ((res = sscanf(rl_line_buffer, "%31s %10239[^;]", word, arg)) <= 0) { rl_attempted_completion_over = 1; return NULL; } @@ -4065,9 +4163,9 @@ char ** readline_completer(char *text, int start, int end) { static void client(void) { - char line[1024]; + char line[10240]; - line[1023] = '\0'; + line[10239] = '\0'; #if HAVE_GETTIMEOFDAY gettimeofday (&tv_start, 0); @@ -4086,7 +4184,7 @@ static void client(void) if (*line_in) add_history(line_in); #endif - strncpy(line, line_in, 1023); + strncpy(line, line_in, 10239); free (line_in); } #endif @@ -4095,7 +4193,7 @@ static void client(void) char *end_p; printf (C_PROMPT); fflush(stdout); - if (!fgets(line, 1023, stdin)) + if (!fgets(line, 10239, stdin)) break; if ((end_p = strchr (line, '\n'))) *end_p = '\0';