diff --git a/Makefile.linux32 b/Makefile.linux32 index 261185d..0b811ae 100644 --- a/Makefile.linux32 +++ b/Makefile.linux32 @@ -1,5 +1,9 @@ TSMAPIDIR=/opt/tivoli/tsm/client/api/bin/sample -TSMLIB=-lApiDS + +# ** For Digest Calculations, we need to link to openssl libraries, and enable USE_DIGEST in tsmpipe.h ** +#TSMLIB=-lApiDS +TSMLIB=-lApiDS -lssl + CC=gcc CFLAGS=-g -W -Wall -Wextra -O -m32 -I$(TSMAPIDIR) LDFLAGS= diff --git a/Makefile.linux64 b/Makefile.linux64 index 1e1d84e..9c8acdd 100644 --- a/Makefile.linux64 +++ b/Makefile.linux64 @@ -1,5 +1,9 @@ TSMAPIDIR=/opt/tivoli/tsm/client/api/bin64/sample -TSMLIB=-lApiTSM64 + +# ** For Digest Calculations, we need to link to openssl libraries, and enable USE_DIGEST in tsmpipe.h ** +#TSMLIB=-lApiTSM64 +TSMLIB=-lApiTSM64 -lssl + CC=gcc CFLAGS=-g -W -Wall -Wextra -O -m64 -I$(TSMAPIDIR) LDFLAGS= diff --git a/lib/dsmsendrecv.c b/lib/dsmsendrecv.c index 1b47b0f..62be381 100644 --- a/lib/dsmsendrecv.c +++ b/lib/dsmsendrecv.c @@ -28,6 +28,10 @@ #include "../tsmpipe.h" +#ifdef USE_DIGEST +#include +#endif + int tsm_matchone_cb(dsmQueryType qType, DataBlk *qResp, void *userdata) { struct matchone_cb_data *cbdata = userdata; @@ -118,7 +122,11 @@ int tsm_regfs(dsUint32_t dsmHandle, char *fsname) { } /* Send data to TSM for storage */ +#ifdef USE_DIGEST +int tsm_sendfile(dsUint32_t dsmHandle, char *fsname, char *filename, long long length, char *description, dsmSendType sendtype, char *digest) { +#else int tsm_sendfile(dsUint32_t dsmHandle, char *fsname, char *filename, long long length, char *description, dsmSendType sendtype) { +#endif extern int verbose; char *buffer; dsInt16_t rc=0; @@ -138,6 +146,24 @@ int tsm_sendfile(dsUint32_t dsmHandle, char *fsname, char *filename, long long l exit(255); } +#ifdef USE_DIGEST + EVP_MD_CTX mdctx; + const EVP_MD *md=NULL; + unsigned char md_value[EVP_MAX_MD_SIZE]; + unsigned int md_len, i; + + if (digest) { + OpenSSL_add_all_digests(); + + md = EVP_get_digestbyname(digest); + + if (! md) { + printf("tsm_sendfile: Unknown message digest %s\n", digest); + return 0; + } + } +#endif + // Register our filespace if (! tsm_regfs(dsmHandle,fsname)) exit(3); @@ -210,6 +236,13 @@ int tsm_sendfile(dsUint32_t dsmHandle, char *fsname, char *filename, long long l return(0); } +#ifdef USE_DIGEST + if (digest) { + EVP_MD_CTX_init(&mdctx); + EVP_DigestInit_ex(&mdctx, md, NULL); + } +#endif + memset(&dataBlk,0x00,sizeof(DataBlk)); dataBlk.stVersion = DataBlkVersion; @@ -224,6 +257,11 @@ int tsm_sendfile(dsUint32_t dsmHandle, char *fsname, char *filename, long long l break; } +#ifdef USE_DIGEST + if (digest) + EVP_DigestUpdate(&mdctx, buffer, nbytes); +#endif + dataBlk.bufferLen = nbytes; dataBlk.numBytes = 0; dataBlk.bufferPtr = buffer; @@ -274,6 +312,17 @@ int tsm_sendfile(dsUint32_t dsmHandle, char *fsname, char *filename, long long l } } +#ifdef USE_DIGEST + if (digest) { + EVP_DigestFinal_ex(&mdctx, md_value, &md_len); + EVP_MD_CTX_cleanup(&mdctx); + + fprintf(stderr,"%s: ",digest); + for(i=0; i