X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=util%2Fyaz-illclient.c;h=5693366d99418a825acbaa746ac1d95eb05079d5;hp=f2734dcb7a7a66fcb90faf62e3f9fda398a76976;hb=4df8de77ce5d4d97a9d5588f49a5c8298183776e;hpb=a51cfbf3f8ca5c487fc8bbcecb4e456a08162a33 diff --git a/util/yaz-illclient.c b/util/yaz-illclient.c index f2734dc..5693366 100644 --- a/util/yaz-illclient.c +++ b/util/yaz-illclient.c @@ -1,8 +1,6 @@ -/* - * Copyright (C) 1995-2006, Index Data ApS +/* This file is part of the YAZ toolkit. + * Copyright (C) Index Data * See the file LICENSE for details. - * - * $Id: yaz-illclient.c,v 1.7 2007-05-30 13:59:04 heikki Exp $ */ /* WARNING - This is work in progress - not at all ready */ @@ -15,7 +13,7 @@ * and yaz already provides the APDUS for it. * * This is not an interactive client like yaz-client, but driven by command- - * line arguments. Its output is a return code, and possibly some text on + * line arguments. Its output is a return code, and possibly some text on * stdout. * * Exit codes (note, the program exits as soon as it finds a good reason) @@ -33,6 +31,9 @@ * * */ +#if HAVE_CONFIG_H +#include +#endif #include #include @@ -105,9 +106,9 @@ struct nameval *parse_nameval( char *arg ) { struct nameval *nv = (struct nameval *) xmalloc(sizeof(*nv)); char *p=arg; int len; - if (!p || !*p) + if (!p || !*p) return 0; /* yeah, leaks a bit of memory. so what */ - while ( *p && ( *p != '=' ) ) + while ( *p && ( *p != '=' ) ) p++; len = p - arg; if (!len) @@ -133,7 +134,7 @@ void append_nameval (struct prog_args *args, struct nameval *nv) { return; if (args->namevals) { nv->next=args->namevals->next; /* first */ - args->namevals->next=nv; + args->namevals->next=nv; args->namevals=nv; } else { nv->next=nv; @@ -144,7 +145,7 @@ void append_nameval (struct prog_args *args, struct nameval *nv) { /** \brief parse a parameter file */ void parse_paramfile(char *arg, struct prog_args *args) { FILE *f=fopen(arg,"r"); -#define BUFSIZE 4096 +#define BUFSIZE 4096 char buf[BUFSIZE]; int len; struct nameval *nv; @@ -184,7 +185,7 @@ void parseargs( int argc, char * argv[], struct prog_args *args) { int ret; char *arg; char *prog=*argv; - char *version="$Id: yaz-illclient.c,v 1.7 2007-05-30 13:59:04 heikki Exp $"; /* from cvs */ + char version[60]; struct nameval *nv; /* default values */ @@ -194,7 +195,7 @@ void parseargs( int argc, char * argv[], struct prog_args *args) { args->oclc_recno=0; args->auth_userid = 0; args->auth_passwd = 0; -#if 0 +#if 0 /* Example 3 - directly from OCLC, supposed to work on their test server*/ args->auth_userid = "100-310-658" ; /* FIXME - get from cmd line */ args->auth_passwd = "apii2test" ; /* FIXME - get from cmd line */ @@ -222,8 +223,10 @@ void parseargs( int argc, char * argv[], struct prog_args *args) { break; case 'l': yaz_log_init_file(arg); + break; case 'V': - printf("%s %s",prog, version ); + yaz_version(version, 0); + printf("%s %s\n",prog, version); break; case 'D': nv=parse_nameval(arg); @@ -287,7 +290,7 @@ COMSTACK connect_to( char *hostaddr ){ hostaddr ); exit(2); } - + yaz_log(YLOG_DEBUG,"Created stack ok "); status = cs_connect(stack, server_address_ip); @@ -306,11 +309,11 @@ COMSTACK connect_to( char *hostaddr ){ Z_PromptObject1 *makeprompt(struct prog_args *args, ODR odr) { Z_PromptObject1 *p = (Z_PromptObject1 *) odr_malloc(odr, sizeof(*p) ); Z_ResponseUnit1 *ru = (Z_ResponseUnit1 *) odr_malloc(odr, sizeof(*ru) ); - + p->which=Z_PromptObject1_response; p->u.response = (Z_Response1*) odr_malloc(odr, sizeof(*(p->u.response)) ); p->u.response->num=2; - p->u.response->elements= (Z_ResponseUnit1 **) odr_malloc(odr, + p->u.response->elements= (Z_ResponseUnit1 **) odr_malloc(odr, p->u.response->num*sizeof(*(p->u.response->elements)) ); /* user id, aka "oclc authorization number" */ p->u.response->elements[0] = ru; @@ -318,7 +321,7 @@ Z_PromptObject1 *makeprompt(struct prog_args *args, ODR odr) { ru->promptId->which = Z_PromptId_enumeratedPrompt; ru->promptId->u.enumeratedPrompt = (Z_PromptIdEnumeratedPrompt *) odr_malloc(odr, sizeof(*(ru->promptId->u.enumeratedPrompt) )); - ru->promptId->u.enumeratedPrompt->type = + ru->promptId->u.enumeratedPrompt->type = odr_intdup(odr,Z_PromptIdEnumeratedPrompt_userId); ru->promptId->u.enumeratedPrompt->suggestedString = 0 ; ru->which = Z_ResponseUnit1_string ; @@ -330,7 +333,7 @@ Z_PromptObject1 *makeprompt(struct prog_args *args, ODR odr) { ru->promptId->which = Z_PromptId_enumeratedPrompt; ru->promptId->u.enumeratedPrompt = (Z_PromptIdEnumeratedPrompt *) odr_malloc(odr, sizeof(*(ru->promptId->u.enumeratedPrompt) )); - ru->promptId->u.enumeratedPrompt->type = + ru->promptId->u.enumeratedPrompt->type = odr_intdup(odr,Z_PromptIdEnumeratedPrompt_password); ru->promptId->u.enumeratedPrompt->suggestedString = 0 ; ru->which = Z_ResponseUnit1_string ; @@ -354,21 +357,21 @@ ILL_Extension *makepromptextension(struct prog_args *args, ODR odr) { yaz_log(YLOG_FATAL,"Encoding of z_PromptObject1 failed "); exit (6); } - + printf ("Prompt: \n"); /*!*/ z_PromptObject1(odr_prt, &p, 0,0 ); /*!*/ buf= odr_getbuf(odr_ext,&siz,0); - ext->u.single_ASN1_type=(Odr_any *) + ext->u.single_ASN1_type=(Odr_any *) odr_malloc(odr,sizeof(*ext->u.single_ASN1_type)); - ext->u.single_ASN1_type->buf= (unsigned char *) odr_malloc(odr, siz); + ext->u.single_ASN1_type->buf= (char *) odr_malloc(odr, siz); memcpy(ext->u.single_ASN1_type->buf,buf, siz ); - ext->u.single_ASN1_type->len = ext->u.single_ASN1_type->size = siz; + ext->u.single_ASN1_type->len = siz; odr_reset(odr_ext); odr_reset(odr_prt); /*!*/ e->identifier = odr_intdup(odr,1); - e->critical = odr_intdup(odr,0); + e->critical = odr_booldup(odr,0); e->item = (Odr_any *) odr_malloc(odr,sizeof(*e->item)); if ( ! z_External(odr_ext, &ext,0,0) ) { yaz_log(YLOG_FATAL,"Encoding of z_External failed "); @@ -376,10 +379,10 @@ ILL_Extension *makepromptextension(struct prog_args *args, ODR odr) { } printf("External: \n"); z_External(odr_prt, &ext,0,0); /*!*/ - buf= odr_getbuf(odr_ext,&siz,0); - e->item->buf= (unsigned char *) odr_malloc(odr, siz); + buf= odr_getbuf(odr_ext,&siz,0); + e->item->buf= (char *) odr_malloc(odr, siz); memcpy(e->item->buf,buf, siz ); - e->item->len = e->item->size = siz; + e->item->len = siz; odr_destroy(odr_prt); odr_destroy(odr_ext); @@ -413,21 +416,21 @@ ILL_Extension *makeoclcextension(struct prog_args *args, ODR odr) { yaz_log(YLOG_FATAL,"Encoding of ill_OCLCILLRequestExtension failed "); exit (6); } - + printf ("OCLC: \n"); /*!*/ ill_OCLCILLRequestExtension(odr_prt, &oc, 0,0 ); /*!*/ buf= odr_getbuf(odr_ext,&siz,0); ext->u.single_ASN1_type = (Odr_any*) odr_malloc(odr,sizeof(*ext->u.single_ASN1_type)); - ext->u.single_ASN1_type->buf = (unsigned char *) odr_malloc(odr, siz); + ext->u.single_ASN1_type->buf = (char *) odr_malloc(odr, siz); memcpy(ext->u.single_ASN1_type->buf,buf, siz ); - ext->u.single_ASN1_type->len = ext->u.single_ASN1_type->size = siz; + ext->u.single_ASN1_type->len = siz; odr_reset(odr_ext); odr_reset(odr_prt); /*!*/ e->identifier = odr_intdup(odr,1); - e->critical = odr_intdup(odr,0); + e->critical = odr_booldup(odr,0); e->item = (Odr_any *) odr_malloc(odr,sizeof(*e->item)); if ( ! z_External(odr_ext, &ext,0,0) ) { yaz_log(YLOG_FATAL,"Encoding of z_External failed "); @@ -435,10 +438,10 @@ ILL_Extension *makeoclcextension(struct prog_args *args, ODR odr) { } printf("External: \n"); z_External(odr_prt, &ext,0,0); /*!*/ - buf= odr_getbuf(odr_ext,&siz,0); - e->item->buf= (unsigned char *) odr_malloc(odr, siz); + buf= odr_getbuf(odr_ext,&siz,0); + e->item->buf= (char *) odr_malloc(odr, siz); memcpy(e->item->buf, buf, siz); - e->item->len = e->item->size = siz; + e->item->len = siz; odr_destroy(odr_prt); odr_destroy(odr_ext); @@ -461,8 +464,9 @@ ILL_APDU *createrequest( struct prog_args *args, ODR odr) { if (args->oclc_auth) { req->num_iLL_request_extensions=2; req->iLL_request_extensions= + (ILL_Extension **) odr_malloc(odr, req->num_iLL_request_extensions* - sizeof(*req->iLL_request_extensions)); + sizeof(*req->iLL_request_extensions)); req->iLL_request_extensions[0]=makepromptextension(args,odr); req->iLL_request_extensions[1]=makeoclcextension(args,odr); } @@ -480,7 +484,7 @@ void sendrequest(ILL_APDU *apdu, ODR odr, COMSTACK stack ) { char *buf_out; int len_out; int res; - if (!ill_APDU (odr, &apdu, 0, 0)) { + if (!ill_APDU (odr, &apdu, 0, 0)) { yaz_log(YLOG_FATAL,"ill_Apdu failed"); exit(2); } @@ -502,10 +506,19 @@ void sendrequest(ILL_APDU *apdu, ODR odr, COMSTACK stack ) { } if (1) { FILE *F = fopen("req.apdu","w"); - fwrite ( buf_out, 1, len_out, F); - fclose(F); + if (!F) + { + yaz_log(YLOG_FATAL|YLOG_ERRNO, "open req.apdu failed"); + } + else + { + if (fwrite ( buf_out, 1, len_out, F) != len_out) + yaz_log(YLOG_FATAL|YLOG_ERRNO, "write req.apdu failed"); + if (fclose(F)) + yaz_log(YLOG_FATAL|YLOG_ERRNO, "write req.apdu failed"); + } } - + } /* sendrequest */ /* * * * * * * * * * * * * * * */ @@ -520,7 +533,7 @@ ILL_APDU *getresponse( COMSTACK stack, ODR in_odr ){ yaz_log(YLOG_DEBUG,"Got a response of %d bytes at %p. res=%d", len_in,buf_in, res); if (res<0) { yaz_log(YLOG_FATAL,"Could not receive packet. code %d",res ); - yaz_log(YLOG_DEBUG,"%02x %02x %02x %02x %02x %02x %02x %02x ...", + yaz_log(YLOG_DEBUG,"%02x %02x %02x %02x %02x %02x %02x %02x ...", buf_in[0], buf_in[1], buf_in[2], buf_in[3], buf_in[4], buf_in[5], buf_in[6], buf_in[7] ); yaz_log(YLOG_DEBUG,"PDU Dump:"); @@ -537,7 +550,7 @@ ILL_APDU *getresponse( COMSTACK stack, ODR in_odr ){ sprintf(msg, "ODR code %d:%d element=%-20s", err, x, element ? element : ""); yaz_log(YLOG_FATAL,"Error decoding incoming packet: %s",msg); - yaz_log(YLOG_DEBUG,"%02x %02x %02x %02x %02x %02x %02x %02x ...", + yaz_log(YLOG_DEBUG,"%02x %02x %02x %02x %02x %02x %02x %02x ...", buf_in[0], buf_in[1], buf_in[2], buf_in[3], buf_in[4], buf_in[5], buf_in[6], buf_in[7] ); yaz_log(YLOG_DEBUG,"PDU Dump:"); @@ -560,7 +573,7 @@ void dumpapdu( ILL_APDU *apdu) { ILL_Status_Or_Error_Report *getstaterr( ILL_APDU *resp, ODR in_odr ) { if (resp->which != ILL_APDU_Status_Or_Error_Report ) { const char *element = odr_getelement(in_odr); - if (!element) + if (!element) element="unknown"; printf("Server returned wrong packet type: %d\n", resp->which); yaz_log(YLOG_FATAL,"Server returned a (%d) and " @@ -573,9 +586,9 @@ ILL_Status_Or_Error_Report *getstaterr( ILL_APDU *resp, ODR in_odr ) { /** \brief Return a printable string from an ILL_String */ char *getillstring( ILL_String *s) { - if (s->which == ILL_String_GeneralString ) + if (s->which == ILL_String_GeneralString ) return s->u.GeneralString; - else if (s->which == ILL_String_EDIFACTString ) + else if (s->which == ILL_String_EDIFACTString ) return s->u.EDIFACTString; else { yaz_log(YLOG_FATAL,"Invalid ILL_String "); @@ -598,15 +611,15 @@ void checkerr( ILL_Status_Or_Error_Report *staterr ) { printf("Already forwarded: \n"); break; case ILL_User_Error_Report_intermediary_problem: - printf("Intermediary problem: %d\n", + printf("Intermediary problem: " ODR_INT_PRINTF "\n", *uerr->u.intermediary_problem); break; case ILL_User_Error_Report_security_problem: - printf("Security problem: %s\n", + printf("Security problem: %s\n", getillstring(uerr->u.security_problem)); break; case ILL_User_Error_Report_unable_to_perform: - printf("Unable to perform: %d\n", + printf("Unable to perform: " ODR_INT_PRINTF "\n", *uerr->u.unable_to_perform); break; default: @@ -618,11 +631,11 @@ void checkerr( ILL_Status_Or_Error_Report *staterr ) { ILL_Provider_Error_Report *perr= err->provider_error_report; switch( perr->which ) { case ILL_Provider_Error_Report_general_problem: - printf("General Problem: %d:", + printf("General Problem: " ODR_INT_PRINTF ":", *perr->u.general_problem); break; case ILL_Provider_Error_Report_transaction_id_problem: - printf("Transaction Id Problem: %d:", + printf("Transaction Id Problem: " ODR_INT_PRINTF ":", *perr->u.general_problem); break; case ILL_Provider_Error_Report_state_transition_prohibited: @@ -630,11 +643,11 @@ void checkerr( ILL_Status_Or_Error_Report *staterr ) { break; } /*exit(7);*/ - } + } /* fallbacks */ - if ( staterr->note ) + if ( staterr->note ) printf("%s", getillstring(staterr->note)); - else + else printf("Unknown error type"); printf("\n"); exit(7); @@ -645,7 +658,7 @@ void checkerr( ILL_Status_Or_Error_Report *staterr ) { /* * * * * * * * * * * * * * * */ -/** \brief Main program +/** \brief Main program * * Parse arguments * Validate arguments @@ -670,11 +683,11 @@ int main (int argc, char * argv[]) { validateargs(&args); stack = connect_to(args.host); apdu = createrequest(&args, out_odr); - if (1) + if (1) dumpapdu(apdu); - sendrequest(apdu, out_odr, stack ); + sendrequest(apdu, out_odr, stack ); resp = getresponse(stack, in_odr ); - if (1) + if (1) dumpapdu(resp); staterr=getstaterr(resp, in_odr); checkerr(staterr); @@ -687,6 +700,7 @@ int main (int argc, char * argv[]) { /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab