X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=client%2Fclient.c;h=f0cab9b7b5d2f1313f48fd286bf80d9f5ee18a7c;hp=429a1fef8936a180f09b40bb9b760e0a3d262376;hb=8fa3d0c0967fd6db5c7a2b2ffc504cb48407a586;hpb=c365079c73de2cc75ca3630098c448f788a9007c diff --git a/client/client.c b/client/client.c index 429a1fe..f0cab9b 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.237 2004-04-07 13:47:59 adam Exp $ + * $Id: client.c,v 1.246 2004-08-11 11:44:30 adam Exp $ */ #include @@ -16,6 +16,15 @@ #include #endif +#if HAVE_OPENSSL_SSL_H +#include +#include +#include +#include +#include +#include +#endif + #include #include @@ -529,6 +538,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); @@ -586,6 +598,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 +723,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) @@ -747,8 +785,10 @@ static void display_record(Z_External *r) else if (r->which == Z_External_octet) { const char *octet_buf = (char*)r->u.octet_aligned->buf; - if (ent->value == VAL_TEXT_XML || ent->value == VAL_APPLICATION_XML || - ent->value == VAL_HTML) + if (ent->oclass == CLASS_RECSYN && + (ent->value == VAL_TEXT_XML || + ent->value == VAL_APPLICATION_XML || + ent->value == VAL_HTML)) { print_record((const unsigned char *) octet_buf, r->u.octet_aligned->len); @@ -1072,7 +1112,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); @@ -1081,7 +1121,7 @@ static int send_deleteResultSetRequest(const char *arg) } else { - *req->deleteFunction = Z_DeleteRequest_all; + *req->deleteFunction = Z_DeleteResultSetRequest_all; req->resultSetList = 0; } @@ -1226,7 +1266,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]; @@ -1295,13 +1334,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; } @@ -1925,8 +1960,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; @@ -1987,21 +2020,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) @@ -2305,9 +2334,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); @@ -2318,20 +2345,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 *) @@ -2343,14 +2362,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; @@ -2502,25 +2522,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; @@ -2530,10 +2559,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"); @@ -2674,11 +2701,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); @@ -2862,10 +2889,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; } @@ -2975,10 +2999,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; } @@ -2986,7 +3007,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"); @@ -3170,7 +3191,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; } @@ -3183,7 +3204,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; } @@ -3206,9 +3227,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; @@ -3304,7 +3327,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"); @@ -3593,19 +3620,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) { @@ -3613,13 +3642,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; @@ -3789,6 +3819,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}, @@ -3924,13 +3955,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'; @@ -3941,7 +3972,7 @@ void process_cmd_line(char* line) /* removed tailing spaces from the arg command */ { - char* p = arg; + unsigned char* p = arg; char* lastnonspace=NULL; for(;*p; ++p) { @@ -4015,9 +4046,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; } @@ -4063,9 +4094,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); @@ -4084,7 +4115,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 @@ -4093,7 +4124,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';